Browse Source

Merge remote-tracking branch 'origin/master'

lipenghui 5 ngày trước cách đây
mục cha
commit
0ba3adb4a3
35 tập tin đã thay đổi với 1464 bổ sung169 xóa
  1. 3 0
      yudao-module-pms/yudao-module-pms-api/src/main/java/cn/iocoder/yudao/module/pms/enums/ErrorCodeConstant.java
  2. 22 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotopeationfill/IotOpeationFillController.java
  3. 2 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotopeationfill/vo/IotOpeationFillSaveReqVO.java
  4. 117 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationplan/IotOperationPlanController.java
  5. 61 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationplan/vo/IotOperationPlanPageReqVO.java
  6. 72 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationplan/vo/IotOperationPlanRespVO.java
  7. 62 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationplan/vo/IotOperationPlanSaveReqVO.java
  8. 95 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationplandev/IotOperationPlanDevController.java
  9. 37 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationplandev/vo/IotOperationPlanDevPageReqVO.java
  10. 43 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationplandev/vo/IotOperationPlanDevRespVO.java
  11. 32 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationplandev/vo/IotOperationPlanDevSaveReqVO.java
  12. 1 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttask/vo/IotProjectTaskRespVO.java
  13. 1 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotprojecttask/vo/IotProjectTaskSaveReqVO.java
  14. 1 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotcountdata/IotCountDataDO.java
  15. 3 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotopeationfill/IotOpeationFillDO.java
  16. 3 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotopeationfill/IotOpeationFillOrderDO.java
  17. 82 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotoperationplan/IotOperationPlanDO.java
  18. 53 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotoperationplandev/IotOperationPlanDevDO.java
  19. 2 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotprojecttask/IotProjectTaskDO.java
  20. 1 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/IotDeviceMapper.java
  21. 13 4
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotopeationfill/IotOpeationFillMapper.java
  22. 41 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotoperationplan/IotOperationPlanMapper.java
  23. 37 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotoperationplandev/IotOperationPlanDevMapper.java
  24. 0 139
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/job/IotOperationFillJob.java
  25. 211 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/job/IotOperationPlanJob.java
  26. 4 2
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/IotDeviceServiceImpl.java
  27. 12 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotopeationfill/IotOpeationFillService.java
  28. 42 6
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotopeationfill/IotOpeationFillServiceImpl.java
  29. 57 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotoperationplan/IotOperationPlanService.java
  30. 98 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotoperationplan/IotOperationPlanServiceImpl.java
  31. 55 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotoperationplandev/IotOperationPlanDevService.java
  32. 76 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotoperationplandev/IotOperationPlanDevServiceImpl.java
  33. 80 14
      yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotOpeationFillMapper.xml
  34. 28 0
      yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotOperationPlanDevMapper.xml
  35. 17 0
      yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotOperationPlanMapper.xml

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

@@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.common.exception.ErrorCode;
 public interface ErrorCodeConstant{
     ErrorCode IOT_PRODUCT_CLASSIFY_NOT_EXISTS = new ErrorCode(100, "设备分类不存在");
     ErrorCode IOT_DEVICE_NOT_EXISTS = new ErrorCode(101, "设备台账不存在");
+    ErrorCode IOT_DEPT_NOT_SELECTED = new ErrorCode(101, "请选择施工队伍");
     ErrorCode IOT_DEVICE_EXISTED = new ErrorCode(101, "设备台账已存在");
     ErrorCode NOT_EXISTS = new ErrorCode( 122, "供应商主数据不存在");
     ErrorCode SUPPLIER_UPDATE_AUDIT_STATUS_FAIL_NOT_PROCESS = new ErrorCode(1-060-000-002, "更新供应商审核状态失败,原因:供应商不是审核中状态");
@@ -76,4 +77,6 @@ public interface ErrorCodeConstant{
     ErrorCode IOT_APP_NOT_EXISTS = new ErrorCode(155, "app版本不存在");
     ErrorCode IOT_ATTACHMENT_NOT_EXISTS = new ErrorCode(1_002_004_004, "附件不存在");
     ErrorCode IOT_PROJECT_TASK_SCHEDULE_NOT_EXISTS = new ErrorCode(1_002_004_005, "项目任务时间表/施工进度不存在");
+    ErrorCode IOT_OPERATION_PLAN_NOT_EXISTS = new ErrorCode(156, "运行记录计划不存在");
+    ErrorCode IOT_OPERATION_PLAN_DEV_NOT_EXISTS = new ErrorCode(157, "运行记录计划设备不存在");
 }

+ 22 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotopeationfill/IotOpeationFillController.java

@@ -166,6 +166,15 @@ public class IotOpeationFillController {
         return success(true);
     }
 
+
+    @PutMapping("/update1")
+    @Operation(summary = "更新运行记录填报")
+    @PreAuthorize("@ss.hasPermission('rq:iot-opeation-fill:update')")
+    public CommonResult<Boolean> updateIotOpeationFill1(@Valid @RequestBody IotOpeationFillSaveReqVO updateReqVO) {
+        iotOpeationFillService.upFill1(updateReqVO);
+        return success(true);
+    }
+
     @DeleteMapping("/delete")
     @Operation(summary = "删除运行记录填报")
     @Parameter(name = "id", description = "编号", required = true)
@@ -255,6 +264,7 @@ public class IotOpeationFillController {
         for (IotOpeationFillOrderDO orderDO : fillList.getList()) {
             fill.setOrderId(orderDO.getId());
             List<IotOpeationFillDO> dList = iotOpeationFillService.fillListByDeptId(fill);
+            IotOpeationFillDO devList = iotOpeationFillService.devListByOrderId(fill);
             if(dList.size()>0){
                 List<String> detail = new ArrayList<>();
                 for (IotOpeationFillDO fillDO:dList) {
@@ -262,6 +272,9 @@ public class IotOpeationFillController {
                     detail.add(a);
                 }
                 orderDO.setFillList(detail.toString().substring(1, detail.toString().length() - 1));
+                orderDO.setAllDev(devList.getAllDev());
+                orderDO.setFillDev(devList.getFillDev());
+                orderDO.setUnFillDev(devList.getUnFillDev());
             }
         }
         return success(BeanUtils.toBean(fillList, IotOpeationFillOrderDO.class));
@@ -274,6 +287,15 @@ public class IotOpeationFillController {
         return success(BeanUtils.toBean( iotOpeationFillService.fillRecords(pageReqVO), IotOpeationFillOrderDO.class));
     }
 
+    @GetMapping("/planDevPage")
+    @Operation(summary = "获得运行计划填报分页")
+    public CommonResult<PageResult<IotDeviceRespVO>> getPlan(@Valid IotOpeationFillPageReqVO pageReqVO) {
+
+        return success(BeanUtils.toBean( iotOpeationFillService.getFillDevices1(pageReqVO), IotDeviceRespVO.class));
+    }
+
+
+
     @GetMapping("/countPage")
     @Operation(summary = "获得运行记录设备填报分页")
     public CommonResult<PageResult<IotDeviceCountData>> countPage(@Valid IotOpeationFillPageReqVO pageReqVO) {

+ 2 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotopeationfill/vo/IotOpeationFillSaveReqVO.java

@@ -88,4 +88,6 @@ public class IotOpeationFillSaveReqVO {
     private Integer isSum;
 
     private Long sumId;
+
+    private String reason;
 }

+ 117 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationplan/IotOperationPlanController.java

@@ -0,0 +1,117 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotoperationplan;
+
+import cn.iocoder.yudao.module.pms.service.iotoperationplandev.IotOperationPlanDevService;
+import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserUpdateStatusReqVO;
+import cn.iocoder.yudao.module.system.service.dept.DeptService;
+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 io.swagger.v3.oas.annotations.Operation;
+
+import javax.validation.constraints.*;
+import javax.validation.*;
+import javax.servlet.http.*;
+import java.util.*;
+import java.io.IOException;
+
+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.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 cn.iocoder.yudao.module.pms.controller.admin.iotoperationplan.vo.*;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationplan.IotOperationPlanDO;
+import cn.iocoder.yudao.module.pms.service.iotoperationplan.IotOperationPlanService;
+
+@Tag(name = "管理后台 - 运行记录计划")
+@RestController
+@RequestMapping("/rq/iot-operation-plan")
+@Validated
+public class IotOperationPlanController {
+
+    @Resource
+    private IotOperationPlanService iotOperationPlanService;
+    @Resource
+    private IotOperationPlanDevService planDevService;
+    @Resource
+    private DeptService deptService;
+
+    @PutMapping("/update-status")
+    @Operation(summary = "修改巡检计划状态")
+    @PreAuthorize("@ss.hasPermission('rq:iot-inspect-plan:update')")
+    public CommonResult<Boolean> updateUserStatus(@Valid @RequestBody UserUpdateStatusReqVO reqVO) {
+        iotOperationPlanService.updateInspectPlanStatus(reqVO.getId(), reqVO.getStatus());
+        return success(true);
+    }
+
+
+
+    @PostMapping("/create")
+    @Operation(summary = "创建运行记录计划")
+    @PreAuthorize("@ss.hasPermission('rq:iot-operation-plan:create')")
+    public CommonResult<Long> createIotOperationPlan(@Valid @RequestBody IotOperationPlanSaveReqVO createReqVO) {
+        return success(iotOperationPlanService.createIotOperationPlan(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新运行记录计划")
+    @PreAuthorize("@ss.hasPermission('rq:iot-operation-plan:update')")
+    public CommonResult<Boolean> updateIotOperationPlan(@Valid @RequestBody IotOperationPlanSaveReqVO updateReqVO) {
+        iotOperationPlanService.updateIotOperationPlan(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除运行记录计划")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('rq:iot-operation-plan:delete')")
+    public CommonResult<Boolean> deleteIotOperationPlan(@RequestParam("id") Long id) {
+        iotOperationPlanService.deleteIotOperationPlan(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得运行记录计划")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('rq:iot-operation-plan:query')")
+    public CommonResult<IotOperationPlanRespVO> getIotOperationPlan(@RequestParam("id") Long id) {
+        IotOperationPlanDO iotOperationPlan = iotOperationPlanService.getIotOperationPlan(id);
+        return success(BeanUtils.toBean(iotOperationPlan, IotOperationPlanRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得运行记录计划分页")
+    @PreAuthorize("@ss.hasPermission('rq:iot-operation-plan:query')")
+    public CommonResult<PageResult<IotOperationPlanRespVO>> getIotOperationPlanPage(@Valid IotOperationPlanPageReqVO pageReqVO) {
+        Set<Long> idList = new HashSet<>();
+        if(Objects.nonNull(pageReqVO.getDeptId())){
+            idList =  deptService.getChildDeptIdListFromCache(pageReqVO.getDeptId());
+            idList.add(pageReqVO.getDeptId());
+        }
+        PageResult<IotOperationPlanDO> pageResult = iotOperationPlanService.getIotOperationPlanPage(pageReqVO,idList);
+        return success(BeanUtils.toBean(pageResult, IotOperationPlanRespVO.class));
+    }
+
+    /*@GetMapping("/export-excel")
+    @Operation(summary = "导出运行记录计划 Excel")
+    @PreAuthorize("@ss.hasPermission('rq:iot-operation-plan:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportIotOperationPlanExcel(@Valid IotOperationPlanPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<IotOperationPlanDO> list = iotOperationPlanService.getIotOperationPlanPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "运行记录计划.xls", "数据", IotOperationPlanRespVO.class,
+                        BeanUtils.toBean(list, IotOperationPlanRespVO.class));
+    }*/
+
+}

+ 61 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationplan/vo/IotOperationPlanPageReqVO.java

@@ -0,0 +1,61 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotoperationplan.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 运行记录计划分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class IotOperationPlanPageReqVO extends PageParam {
+
+    @Schema(description = "巡检计划标题")
+    private String planTitle;
+
+    @Schema(description = "巡检计划编号")
+    private String planCode;
+
+    @Schema(description = "周期")
+    private BigDecimal planCycle;
+
+    @Schema(description = "单位")
+    private String planUnit;
+
+    @Schema(description = "负责人")
+    private String charge;
+
+    @Schema(description = "设备")
+    private String deviceIds;
+
+    @Schema(description = "备注", example = "你说的对")
+    private String remark;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+    @Schema(description = "部门id", example = "28824")
+    private Long deptId;
+
+    @Schema(description = "状态", example = "1")
+    private Integer status;
+
+    @Schema(description = "负责人名称", example = "芋艿")
+    private String chargeName;
+
+    @Schema(description = "上次执行时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] lastCreateTime;
+
+    @Schema(description = "首次执行时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] beginCreateTime;
+
+}

+ 72 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationplan/vo/IotOperationPlanRespVO.java

@@ -0,0 +1,72 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotoperationplan.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 运行记录计划 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class IotOperationPlanRespVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "4449")
+    @ExcelProperty("主键id")
+    private Long id;
+
+    @Schema(description = "巡检计划标题", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("巡检计划标题")
+    private String planTitle;
+
+    @Schema(description = "巡检计划编号", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("巡检计划编号")
+    private String planCode;
+
+    @Schema(description = "周期", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("周期")
+    private BigDecimal planCycle;
+
+    @Schema(description = "单位", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("单位")
+    private String planUnit;
+
+    @Schema(description = "负责人")
+    @ExcelProperty("负责人")
+    private String charge;
+
+    @Schema(description = "设备", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("设备")
+    private String deviceIds;
+
+    @Schema(description = "备注", example = "你说的对")
+    @ExcelProperty("备注")
+    private String remark;
+
+    @Schema(description = "创建时间")
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "部门id", example = "28824")
+    @ExcelProperty("部门id")
+    private Long deptId;
+
+    @Schema(description = "状态", example = "1")
+    @ExcelProperty("状态")
+    private Integer status;
+
+    @Schema(description = "负责人名称", example = "芋艿")
+    @ExcelProperty("负责人名称")
+    private String chargeName;
+
+    @Schema(description = "上次执行时间")
+    @ExcelProperty("上次执行时间")
+    private LocalDateTime lastCreateTime;
+
+    @Schema(description = "首次执行时间")
+    @ExcelProperty("首次执行时间")
+    private LocalDateTime beginCreateTime;
+
+}

+ 62 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationplan/vo/IotOperationPlanSaveReqVO.java

@@ -0,0 +1,62 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotoperationplan.vo;
+
+import cn.iocoder.yudao.module.pms.controller.admin.iotoperationplandev.vo.IotOperationPlanDevSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationplandev.IotOperationPlanDevDO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import javax.validation.constraints.*;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 运行记录计划新增/修改 Request VO")
+@Data
+public class IotOperationPlanSaveReqVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "4449")
+    private Long id;
+
+    @Schema(description = "巡检计划标题", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotEmpty(message = "巡检计划标题不能为空")
+    private String planTitle;
+
+    @Schema(description = "巡检计划编号")
+    private String planCode;
+
+    @Schema(description = "周期", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "周期不能为空")
+    private BigDecimal planCycle;
+
+    @Schema(description = "单位", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotEmpty(message = "单位不能为空")
+    private String planUnit;
+
+    @Schema(description = "负责人")
+    private String charge;
+
+    @Schema(description = "设备", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotEmpty(message = "设备不能为空")
+    private String deviceIds;
+
+    @Schema(description = "备注", example = "你说的对")
+    private String remark;
+
+    @Schema(description = "部门id", example = "28824")
+    private Long deptId;
+
+    @Schema(description = "状态", example = "1")
+    private Integer status;
+
+    @Schema(description = "负责人名称", example = "芋艿")
+    private String chargeName;
+
+    @Schema(description = "上次执行时间")
+    private LocalDateTime lastCreateTime;
+
+    @Schema(description = "首次执行时间")
+    private LocalDateTime beginCreateTime;
+
+    Collection<IotOperationPlanDevDO> planDevList;
+
+}

+ 95 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationplandev/IotOperationPlanDevController.java

@@ -0,0 +1,95 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotoperationplandev;
+
+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 io.swagger.v3.oas.annotations.Operation;
+
+import javax.validation.constraints.*;
+import javax.validation.*;
+import javax.servlet.http.*;
+import java.util.*;
+import java.io.IOException;
+
+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.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 cn.iocoder.yudao.module.pms.controller.admin.iotoperationplandev.vo.*;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationplandev.IotOperationPlanDevDO;
+import cn.iocoder.yudao.module.pms.service.iotoperationplandev.IotOperationPlanDevService;
+
+@Tag(name = "管理后台 - 运行记录计划设备")
+@RestController
+@RequestMapping("/rq/iot-operation-plan-dev")
+@Validated
+public class IotOperationPlanDevController {
+
+    @Resource
+    private IotOperationPlanDevService iotOperationPlanDevService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建运行记录计划设备")
+    @PreAuthorize("@ss.hasPermission('rq:iot-operation-plan-dev:create')")
+    public CommonResult<Long> createIotOperationPlanDev(@Valid @RequestBody IotOperationPlanDevSaveReqVO createReqVO) {
+        return success(iotOperationPlanDevService.createIotOperationPlanDev(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新运行记录计划设备")
+    @PreAuthorize("@ss.hasPermission('rq:iot-operation-plan-dev:update')")
+    public CommonResult<Boolean> updateIotOperationPlanDev(@Valid @RequestBody IotOperationPlanDevSaveReqVO updateReqVO) {
+        iotOperationPlanDevService.updateIotOperationPlanDev(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除运行记录计划设备")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('rq:iot-operation-plan-dev:delete')")
+    public CommonResult<Boolean> deleteIotOperationPlanDev(@RequestParam("id") Long id) {
+        iotOperationPlanDevService.deleteIotOperationPlanDev(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得运行记录计划设备")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('rq:iot-operation-plan-dev:query')")
+    public CommonResult<IotOperationPlanDevRespVO> getIotOperationPlanDev(@RequestParam("id") Long id) {
+        IotOperationPlanDevDO iotOperationPlanDev = iotOperationPlanDevService.getIotOperationPlanDev(id);
+        return success(BeanUtils.toBean(iotOperationPlanDev, IotOperationPlanDevRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得运行记录计划设备分页")
+    @PreAuthorize("@ss.hasPermission('rq:iot-operation-plan-dev:query')")
+    public CommonResult<PageResult<IotOperationPlanDevRespVO>> getIotOperationPlanDevPage(@Valid IotOperationPlanDevPageReqVO pageReqVO) {
+        PageResult<IotOperationPlanDevDO> pageResult = iotOperationPlanDevService.getIotOperationPlanDevPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, IotOperationPlanDevRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出运行记录计划设备 Excel")
+    @PreAuthorize("@ss.hasPermission('rq:iot-operation-plan-dev:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportIotOperationPlanDevExcel(@Valid IotOperationPlanDevPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<IotOperationPlanDevDO> list = iotOperationPlanDevService.getIotOperationPlanDevPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "运行记录计划设备.xls", "数据", IotOperationPlanDevRespVO.class,
+                        BeanUtils.toBean(list, IotOperationPlanDevRespVO.class));
+    }
+
+}

+ 37 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationplandev/vo/IotOperationPlanDevPageReqVO.java

@@ -0,0 +1,37 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotoperationplandev.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 运行记录计划设备分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class IotOperationPlanDevPageReqVO extends PageParam {
+
+    @Schema(description = "资产编码")
+    private String deviceCode;
+
+    @Schema(description = "设备名称", example = "李四")
+    private String deviceName;
+
+    @Schema(description = "部门id", example = "5098")
+    private Long deptId;
+
+    @Schema(description = "计划id", example = "26190")
+    private Long planId;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+    @Schema(description = "状态", example = "2")
+    private Integer status;
+
+}

+ 43 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationplandev/vo/IotOperationPlanDevRespVO.java

@@ -0,0 +1,43 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotoperationplandev.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 运行记录计划设备 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class IotOperationPlanDevRespVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "31462")
+    @ExcelProperty("主键id")
+    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 = "部门id", example = "5098")
+    @ExcelProperty("部门id")
+    private Long deptId;
+
+    @Schema(description = "计划id", example = "26190")
+    @ExcelProperty("计划id")
+    private Long planId;
+
+    @Schema(description = "创建时间")
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "状态", example = "2")
+    @ExcelProperty("状态")
+    private Integer status;
+
+}

+ 32 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotoperationplandev/vo/IotOperationPlanDevSaveReqVO.java

@@ -0,0 +1,32 @@
+package cn.iocoder.yudao.module.pms.controller.admin.iotoperationplandev.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import javax.validation.constraints.*;
+
+@Schema(description = "管理后台 - 运行记录计划设备新增/修改 Request VO")
+@Data
+public class IotOperationPlanDevSaveReqVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "31462")
+    private Long id;
+
+    @Schema(description = "资产编码", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotEmpty(message = "资产编码不能为空")
+    private String deviceCode;
+
+    @Schema(description = "设备名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
+    @NotEmpty(message = "设备名称不能为空")
+    private String deviceName;
+
+    @Schema(description = "部门id", example = "5098")
+    private Long deptId;
+
+    @Schema(description = "计划id", example = "26190")
+    private Long planId;
+
+    @Schema(description = "状态", example = "2")
+    private Integer status;
+
+}

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

@@ -35,7 +35,7 @@ public class IotProjectTaskRespVO {
 
     @Schema(description = "施工设备")
     @ExcelProperty("施工设备")
-    private String deviceIds;
+    private Set<Long> deviceIds;
 
     @Schema(description = "施工工艺")
     @ExcelProperty("施工工艺")

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

@@ -25,7 +25,7 @@ public class IotProjectTaskSaveReqVO {
     private String location;
 
     @Schema(description = "施工设备")
-    private String deviceIds;
+    private Set<Long> deviceIds;
 
     @Schema(description = "施工工艺")
     private String technique;

+ 1 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotcountdata/IotCountDataDO.java

@@ -26,6 +26,7 @@ public class IotCountDataDO {
     private String filledCount;
     private String unfilledCount;
     private String fillingCount;
+    private String ignoreCount;
     @Schema(description = "创建时间")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;

+ 3 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotopeationfill/IotOpeationFillDO.java

@@ -106,5 +106,8 @@ public class IotOpeationFillDO extends BaseDO {
     private String userName;
     private Long orderId;
     private String mobile;
+    private int allDev;
+    private int fillDev;
+    private int unFillDev;
 
 }

+ 3 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotopeationfill/IotOpeationFillOrderDO.java

@@ -44,5 +44,8 @@ public class IotOpeationFillOrderDO extends BaseDO {
     private Integer userId;
     private String mobile;
     private String fillList;
+    private int allDev;
+    private int fillDev;
+    private int unFillDev;
 
 }

+ 82 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotoperationplan/IotOperationPlanDO.java

@@ -0,0 +1,82 @@
+package cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationplan;
+
+import lombok.*;
+import java.util.*;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 运行记录计划 DO
+ *
+ * @author 超级管理员
+ */
+@TableName("rq_iot_operation_plan")
+@KeySequence("rq_iot_operation_plan_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class IotOperationPlanDO extends BaseDO {
+
+    /**
+     * 主键id
+     */
+    @TableId
+    private Long id;
+    /**
+     * 巡检计划标题
+     */
+    private String planTitle;
+    /**
+     * 巡检计划编号
+     */
+    private String planCode;
+    /**
+     * 周期
+     */
+    private BigDecimal planCycle;
+    /**
+     * 单位
+     */
+    private String planUnit;
+    /**
+     * 负责人
+     */
+    private String charge;
+    /**
+     * 设备
+     */
+    private String deviceIds;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 部门id
+     */
+    private Long deptId;
+    /**
+     * 状态
+     */
+    private Integer status;
+    /**
+     * 负责人名称
+     */
+    private String chargeName;
+    /**
+     * 上次执行时间
+     */
+    private LocalDateTime lastCreateTime;
+    /**
+     * 首次执行时间
+     */
+    private LocalDateTime beginCreateTime;
+
+}

+ 53 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotoperationplandev/IotOperationPlanDevDO.java

@@ -0,0 +1,53 @@
+package cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationplandev;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 运行记录计划设备 DO
+ *
+ * @author 超级管理员
+ */
+@TableName("rq_iot_operation_plan_dev")
+@KeySequence("rq_iot_operation_plan_dev_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class IotOperationPlanDevDO extends BaseDO {
+
+    /**
+     * 主键id
+     */
+    @TableId
+    private Long id;
+    /**
+     * 资产编码
+     */
+    private String deviceCode;
+    /**
+     * 设备名称
+     */
+    private String deviceName;
+    /**
+     * 部门id
+     */
+    private Long deptId;
+    /**
+     * 计划id
+     */
+    private Long planId;
+    /**
+     * 状态
+     */
+    private Integer status;
+
+    private Long deviceId;
+
+}

+ 2 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotprojecttask/IotProjectTaskDO.java

@@ -49,7 +49,8 @@ public class IotProjectTaskDO extends BaseDO {
     /**
      * 施工设备
      */
-    private String deviceIds;
+    @TableField(typeHandler = JacksonTypeHandler.class)
+    private Set<Long> deviceIds;
     /**
      * 施工工艺
      */

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

@@ -149,6 +149,7 @@ public interface IotDeviceMapper extends BaseMapperX<IotDeviceDO> {
     default List<IotDeviceDO> selectSimpleList(IotDevicePageReqVO reqVO, Collection<Long> deptIds) {
         return selectList(new LambdaQueryWrapperX<IotDeviceDO>()
                 .inIfPresent(IotDeviceDO::getDeptId, reqVO.getDeptIds())
+                .inIfPresent(IotDeviceDO::getId, reqVO.getDeviceIds())
                 .likeIfPresent(IotDeviceDO::getDeviceCode, reqVO.getDeviceCode())
                 .likeIfPresent(IotDeviceDO::getDeviceName, reqVO.getDeviceName())
                 .inIfPresent(IotDeviceDO::getDeptId, deptIds));

+ 13 - 4
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotopeationfill/IotOpeationFillMapper.java

@@ -59,9 +59,8 @@ public interface IotOpeationFillMapper extends BaseMapperX<IotOpeationFillDO> {
     @TenantIgnore
     List<IotOpeationFillOrderDO> selectListByCreateTime(IotOpeationFillPageReqVO reqVO);
     @TenantIgnore
-    List<IotOpeationFillDO> getFillDevices();
-    @TenantIgnore
-    List<IotOpeationFillDO> getFillDevices1(@Param("deviceIds") List<Long> deviceIds);
+    List<IotOpeationFillDO> getFillDevices(@Param("deviceIds")List<Long> deviceIds);
+
     List<IotModelTemplateAttrsDO> getAttrsById(IotModelTemplateAttrsRespVO vo);
     @TenantIgnore
     int insertFill(List<IotOpeationFillDO> vo);
@@ -72,6 +71,11 @@ public interface IotOpeationFillMapper extends BaseMapperX<IotOpeationFillDO> {
     List<IotOpeationFillDO> fills(@Param("deviceIds")List<Long> deviceIds);
     @TenantIgnore
     int upFill(@Param("deptId")Long deptId,@Param("deviceIds")List<Long> deviceIds);
+    @TenantIgnore
+    int upFill1(IotOpeationFillSaveReqVO vo);
+    @TenantIgnore
+    int upFill2(IotOpeationFillSaveReqVO vo);
+
     @TenantIgnore
     List<IotOpeationFillDO> fillListByUserId(IotOpeationFillRespVO vo);
     @TenantIgnore
@@ -79,6 +83,8 @@ public interface IotOpeationFillMapper extends BaseMapperX<IotOpeationFillDO> {
     @TenantIgnore
     List<IotOpeationFillDO> fillListByDeptId(IotOpeationFillRespVO vo);
     @TenantIgnore
+    IotOpeationFillDO devListByOrderId(IotOpeationFillRespVO vo);
+    @TenantIgnore
     List<IotOpeationFillDO> rdList();
     @TenantIgnore
     List<IotOpeationFillDO> ryList();
@@ -90,7 +96,7 @@ public interface IotOpeationFillMapper extends BaseMapperX<IotOpeationFillDO> {
     List<IotOpeationFillDO> flList(IotOpeationFillDO vo);
 
     @TenantIgnore
-    List<IotOpeationFillDO> pdList();
+    List<IotOpeationFillDO> pdList(@Param("deviceIds")List<Long> deviceIds);
     List<IotOpeationFillDO> deviceList(IotOpeationFillRespVO vo);
     @TenantIgnore
     PageResult<IotOpeationFillDO> fillList1(IotOpeationFillPageReqVO vo);
@@ -116,6 +122,9 @@ public interface IotOpeationFillMapper extends BaseMapperX<IotOpeationFillDO> {
     @TenantIgnore
     IPage<IotOpeationFillOrderDO> fillRecords(IPage<IotOpeationFillPageReqVO> page, @Param("deviceId") Long deviceId, @Param("orderName") String orderName,@Param("orderStatus") Integer orderStatus);
 
+    @TenantIgnore
+    IPage<IotDeviceRespVO> getFillDevices1(IPage<IotOpeationFillPageReqVO> page,@Param("deviceIds") Collection<Long> deviceIds);
+
     @TenantIgnore
     List<DeviceZHBDDO> carList();
 

+ 41 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotoperationplan/IotOperationPlanMapper.java

@@ -0,0 +1,41 @@
+package cn.iocoder.yudao.module.pms.dal.mysql.iotoperationplan;
+
+import java.util.*;
+
+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.module.pms.dal.dataobject.iotoperationplan.IotOperationPlanDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.pms.controller.admin.iotoperationplan.vo.*;
+
+/**
+ * 运行记录计划 Mapper
+ *
+ * @author 超级管理员
+ */
+@Mapper
+public interface IotOperationPlanMapper extends BaseMapperX<IotOperationPlanDO> {
+
+    default PageResult<IotOperationPlanDO> selectPage(IotOperationPlanPageReqVO reqVO,Collection<Long> deptIds) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<IotOperationPlanDO>()
+                .eqIfPresent(IotOperationPlanDO::getPlanTitle, reqVO.getPlanTitle())
+                .eqIfPresent(IotOperationPlanDO::getPlanCode, reqVO.getPlanCode())
+                .eqIfPresent(IotOperationPlanDO::getPlanCycle, reqVO.getPlanCycle())
+                .eqIfPresent(IotOperationPlanDO::getPlanUnit, reqVO.getPlanUnit())
+                .eqIfPresent(IotOperationPlanDO::getCharge, reqVO.getCharge())
+                .eqIfPresent(IotOperationPlanDO::getDeviceIds, reqVO.getDeviceIds())
+                .eqIfPresent(IotOperationPlanDO::getRemark, reqVO.getRemark())
+                .betweenIfPresent(IotOperationPlanDO::getCreateTime, reqVO.getCreateTime())
+                .inIfPresent(IotOperationPlanDO::getDeptId, deptIds)
+                .eqIfPresent(IotOperationPlanDO::getStatus, reqVO.getStatus())
+                .likeIfPresent(IotOperationPlanDO::getChargeName, reqVO.getChargeName())
+                .betweenIfPresent(IotOperationPlanDO::getLastCreateTime, reqVO.getLastCreateTime())
+                .betweenIfPresent(IotOperationPlanDO::getBeginCreateTime, reqVO.getBeginCreateTime())
+                .orderByDesc(IotOperationPlanDO::getId));
+    }
+
+    List<IotOperationPlanDO> getPlanList();
+
+
+}

+ 37 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotoperationplandev/IotOperationPlanDevMapper.java

@@ -0,0 +1,37 @@
+package cn.iocoder.yudao.module.pms.dal.mysql.iotoperationplandev;
+
+import java.util.*;
+
+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.module.pms.dal.dataobject.iotoperationplandev.IotOperationPlanDevDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.pms.controller.admin.iotoperationplandev.vo.*;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 运行记录计划设备 Mapper
+ *
+ * @author 超级管理员
+ */
+@Mapper
+public interface IotOperationPlanDevMapper extends BaseMapperX<IotOperationPlanDevDO> {
+
+    default PageResult<IotOperationPlanDevDO> selectPage(IotOperationPlanDevPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<IotOperationPlanDevDO>()
+                .eqIfPresent(IotOperationPlanDevDO::getDeviceCode, reqVO.getDeviceCode())
+                .likeIfPresent(IotOperationPlanDevDO::getDeviceName, reqVO.getDeviceName())
+                .eqIfPresent(IotOperationPlanDevDO::getDeptId, reqVO.getDeptId())
+                .eqIfPresent(IotOperationPlanDevDO::getPlanId, reqVO.getPlanId())
+                .betweenIfPresent(IotOperationPlanDevDO::getCreateTime, reqVO.getCreateTime())
+                .eqIfPresent(IotOperationPlanDevDO::getStatus, reqVO.getStatus())
+                .orderByDesc(IotOperationPlanDevDO::getId));
+    }
+
+    int delByPlanId(Long planId);
+
+
+    List<IotOperationPlanDevDO> devIdList(@Param("planIds")List<Long> planIds);
+
+}

+ 0 - 139
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/job/IotOperationFillJob.java

@@ -1,139 +0,0 @@
-package cn.iocoder.yudao.module.pms.job;
-
-import cn.hutool.core.collection.CollUtil;
-import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
-import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
-import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
-import cn.iocoder.yudao.framework.tenant.core.job.TenantJob;
-import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
-import cn.iocoder.yudao.module.pms.constant.PmsConstants;
-import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillPageReqVO;
-import cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO;
-import cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillOrderDO;
-import cn.iocoder.yudao.module.pms.dal.mysql.iotopeationfill.IotOpeationFillMapper;
-import cn.iocoder.yudao.module.pms.dal.mysql.iotopeationfill.IotOpeationFillOrderMapper;
-import cn.iocoder.yudao.module.pms.message.PmsMessage;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.scheduling.annotation.EnableScheduling;
-import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.Resource;
-import javax.annotation.security.PermitAll;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.CompletableFuture;
-import java.util.function.Predicate;
-import java.util.stream.Collectors;
-
-import static cn.iocoder.yudao.module.pms.framework.config.MultiThreadConfiguration.PMS_THREAD_POOL_TASK_EXECUTOR;
-
-/**
- * @author yc
- * @version 1.0
- * @className IotOperationFillTask
- * @date 2025/5/11 10:26
- * @description
- */
-@Component
-@Slf4j
-public class IotOperationFillJob implements JobHandler {
-
-
-    @Autowired
-    private IotOpeationFillMapper iotOpeationFillMapper;
-    @Autowired
-    private IotOpeationFillOrderMapper iotOpeationFillOrderMapper;
-    @Resource
-    private PmsMessage pmsMessage;
-    @Resource(name = PMS_THREAD_POOL_TASK_EXECUTOR)
-    private ThreadPoolTaskExecutor pmsThreadPoolTaskExecutor;
-
-
-    @Override
-    public String execute(String param) throws Exception {
-        TenantContextHolder.setIgnore(true);
-        System.out.println("***********创建运行记录填报工单开始执行*********8");
-        List<IotOpeationFillOrderDO> orderList = new ArrayList<>();
-        List<IotOpeationFillDO> pdList = iotOpeationFillMapper.pdList();
-
-        for (IotOpeationFillDO pd:pdList) {
-
-            IotOpeationFillOrderDO fillDO = new IotOpeationFillOrderDO();
-
-            fillDO.setOrderName(pd.getOrgName()+"/"+LocalDate.now()+"运行记录填报");
-            fillDO.setDeptId(pd.getDeptId());
-            fillDO.setOrderStatus(0);
-            fillDO.setCreateTime(LocalDateTime.now());
-            fillDO.setUserName(pd.getUserName());
-            fillDO.setUserId(pd.getUserId());
-            fillDO.setMobile(pd.getMobile());
-            orderList.add(fillDO);
-
-        }
-
-        List<IotOpeationFillDO> deviceList = iotOpeationFillMapper.getFillDevices();
-
-        List<Integer> idList = deviceList.stream().map(IotOpeationFillDO::getUserId).collect(Collectors.toList());
-
-
-
-        List<IotOpeationFillOrderDO> orderList1 = orderList.stream()
-                .filter(obj -> idList.contains(obj.getUserId()))
-                .collect(Collectors.toList());
-
-        iotOpeationFillOrderMapper.insertBatch(orderList1);
-
-
-        //发送钉钉通知
-        pmsThreadPoolTaskExecutor.execute(()->{
-            try{
-                for (IotOpeationFillOrderDO order:orderList1) {
-                    pmsMessage.sendMessage(order.getId(), order.getOrderName(), PmsConstants.GENERATE_OPERATION, (long)order.getUserId(), order.getMobile());
-                }
-            }catch (Exception e){
-                e.printStackTrace();
-            }
-        });
-
-
-        for (IotOpeationFillDO device:deviceList) {
-            System.out.println("deviceUser"+device.getUserId());
-            for (IotOpeationFillOrderDO order:orderList1) {
-                System.out.println("orderId"+order.getUserId());
-                if(device.getUserId().intValue()==order.getUserId().intValue()){
-                    System.out.println("-----相等-------");
-                    device.setOrderId(order.getId());
-                }
-            }
-        }
-
-
-
-
-        System.out.println("***********创建运行记录填报工单执行结束*********8");
-
-
-
-
-
-
-        System.out.println("*****************插入运行记录设备表***********************");
-
-        for (IotOpeationFillDO re:deviceList) {
-            re.setDeviceId(re.getId());
-        }
-        iotOpeationFillMapper.insertFill(deviceList);
-
-
-        System.out.println("*****************插入运行记录设备表完成***********************");
-        return "创建成功";
-    }
-
-}

+ 211 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/job/IotOperationPlanJob.java

@@ -0,0 +1,211 @@
+package cn.iocoder.yudao.module.pms.job;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.iocoder.yudao.framework.common.util.date.DateUtils;
+import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
+import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
+import cn.iocoder.yudao.module.pms.constant.PmsConstants;
+import cn.iocoder.yudao.module.pms.dal.dataobject.inspect.IotInspectPlanDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillOrderDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationplan.IotOperationPlanDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationplandev.IotOperationPlanDevDO;
+import cn.iocoder.yudao.module.pms.dal.mysql.iotopeationfill.IotOpeationFillMapper;
+import cn.iocoder.yudao.module.pms.dal.mysql.iotopeationfill.IotOpeationFillOrderMapper;
+import cn.iocoder.yudao.module.pms.dal.mysql.iotoperationplan.IotOperationPlanMapper;
+import cn.iocoder.yudao.module.pms.dal.mysql.iotoperationplandev.IotOperationPlanDevMapper;
+import cn.iocoder.yudao.module.pms.message.PmsMessage;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static cn.iocoder.yudao.module.pms.framework.config.MultiThreadConfiguration.PMS_THREAD_POOL_TASK_EXECUTOR;
+
+/**
+ * @author yc
+ * @version 1.0
+ * @className IotOperationFillTask
+ * @date 2025/5/11 10:26
+ * @description
+ */
+@Component
+@Slf4j
+public class IotOperationPlanJob implements JobHandler {
+
+
+    @Autowired
+    private IotOpeationFillMapper iotOpeationFillMapper;
+    @Autowired
+    private IotOpeationFillOrderMapper iotOpeationFillOrderMapper;
+    @Resource
+    private PmsMessage pmsMessage;
+    @Resource(name = PMS_THREAD_POOL_TASK_EXECUTOR)
+    private ThreadPoolTaskExecutor pmsThreadPoolTaskExecutor;
+    @Resource
+    private IotOperationPlanMapper planMapper;
+    @Resource
+    private IotOperationPlanDevMapper planDevMapper;
+
+    /**
+     * 1、查询开启状态运行计划
+     * 2、根据计划获取设备
+     * 3、根据设备ID查询设备责任人表,获取user_id
+     * 4、根据user_id生成工单主表数据
+     * 5、生成设备子表数据
+     * 6、根据计划周期确认工单生成时间
+     */
+
+    @Override
+    public String execute(String param) throws Exception {
+        TenantContextHolder.setIgnore(true);
+        System.out.println("***********创建运行记录填报工单开始执行*********8");
+
+
+        //1、查询开启,非删除状态运行计划
+        List<IotOperationPlanDO> planList = planMapper.getPlanList();
+
+        if(planList.size()>0){
+            List<Long> planIds= planList.stream().map(IotOperationPlanDO::getId).collect(Collectors.toList());
+            //2、根据计划获取设备ID
+            List<IotOperationPlanDevDO> devList = planDevMapper.devIdList(planIds);
+            List<Long> devIdList= devList.stream().map(IotOperationPlanDevDO::getId).collect(Collectors.toList());
+            //3、根据设备ID生成主表数据
+            List<IotOpeationFillOrderDO> orderList = new ArrayList<>();
+            List<IotOpeationFillDO> pdList = iotOpeationFillMapper.pdList(devIdList);
+
+            for (IotOpeationFillDO pd:pdList) {
+
+                IotOpeationFillOrderDO fillDO = new IotOpeationFillOrderDO();
+
+                fillDO.setOrderName(pd.getOrgName()+"/"+LocalDate.now()+"运行记录填报");
+                fillDO.setDeptId(pd.getDeptId());
+                fillDO.setOrderStatus(0);
+                fillDO.setCreateTime(LocalDateTime.now());
+                fillDO.setUserName(pd.getUserName());
+                fillDO.setUserId(pd.getUserId());
+                fillDO.setMobile(pd.getMobile());
+                orderList.add(fillDO);
+
+            }
+
+
+            for (IotOperationPlanDO planDO:planList) {
+                if (planDO.getLastCreateTime()==null&& Objects.nonNull(planDO.getBeginCreateTime())) {
+                    //当首次执行时间大于当前时间
+                    if (planDO.getBeginCreateTime().isBefore(LocalDateTime.now())) {
+                        Date date = Date.from(
+                                planDO.getBeginCreateTime().atZone(ZoneId.systemDefault()) // 使用系统默认时区
+                                        .toInstant()                    // 转为 Instant(时间戳)
+                        );
+                        deal(planDO, date,devIdList,orderList);
+                    }
+                } else {
+                    Date lastdate = Date.from(
+                            planDO.getLastCreateTime().atZone(ZoneId.systemDefault()) // 使用系统默认时区
+                                    .toInstant()                    // 转为 Instant(时间戳)
+                    );
+                    deal(planDO, lastdate,devIdList,orderList);
+                }
+            }
+
+
+
+        }
+
+
+        return "创建成功";
+    }
+
+
+    private void deal(IotOperationPlanDO plan, Date date,List<Long> devIdList, List<IotOpeationFillOrderDO> orderList) {
+        Date date1 = new Date();
+        if ("hour".equals(plan.getPlanUnit())){
+            DateTime dateTime = DateUtil.offsetHour(date, Integer.parseInt(StringUtils.substringBeforeLast(String.valueOf(plan.getPlanCycle()),".")));
+            if (date1.compareTo(dateTime) > 0){
+                extracted(devIdList, orderList,plan);
+
+            }
+        } else if ("day".equals(plan.getPlanUnit())){
+            DateTime dateTime = DateUtil.offsetDay(date, Integer.parseInt(StringUtils.substringBeforeLast(String.valueOf(plan.getPlanCycle()),".")));
+            if (date1.compareTo(dateTime) > 0){
+                extracted(devIdList, orderList,plan);
+
+            }
+        } else if ("month".equals(plan.getPlanUnit())){
+            DateTime dateTime = DateUtil.offsetMonth(date, Integer.parseInt(StringUtils.substringBeforeLast(String.valueOf(plan.getPlanCycle()),".")));
+            if (date1.compareTo(dateTime) > 0){
+                extracted(devIdList, orderList,plan);
+
+            }
+        }
+    }
+
+
+
+    private void extracted(List<Long> devIdList, List<IotOpeationFillOrderDO> orderList,IotOperationPlanDO plan) {
+        LocalDateTime localDateTime = DateUtils.contactTime(plan.getBeginCreateTime());
+        plan.setLastCreateTime(localDateTime);
+        planMapper.updateById(plan);
+
+        //4、根据设备ID生成子表数据
+        List<IotOpeationFillDO> deviceList = iotOpeationFillMapper.getFillDevices(devIdList);
+
+        List<Integer> idList = deviceList.stream().map(IotOpeationFillDO::getUserId).collect(Collectors.toList());
+
+
+        List<IotOpeationFillOrderDO> orderList1 = orderList.stream()
+                .filter(obj -> idList.contains(obj.getUserId()))
+                .collect(Collectors.toList());
+
+        iotOpeationFillOrderMapper.insertBatch(orderList1);
+
+
+        /*//发送钉钉通知
+        pmsThreadPoolTaskExecutor.execute(()->{
+            try{
+                for (IotOpeationFillOrderDO order:orderList1) {
+                    pmsMessage.sendMessage(order.getId(), order.getOrderName(), PmsConstants.GENERATE_OPERATION, (long)order.getUserId(), order.getMobile());
+                }
+            }catch (Exception e){
+                e.printStackTrace();
+            }
+        });*/
+
+
+        for (IotOpeationFillDO device:deviceList) {
+            System.out.println("deviceUser"+device.getUserId());
+            for (IotOpeationFillOrderDO order:orderList1) {
+                System.out.println("orderId"+order.getUserId());
+                if(device.getUserId().intValue()==order.getUserId().intValue()){
+                    System.out.println("-----相等-------");
+                    device.setOrderId(order.getId());
+                }
+            }
+        }
+
+
+        System.out.println("***********创建运行记录填报工单执行结束*********8");
+
+
+        System.out.println("*****************插入运行记录设备表***********************");
+
+        for (IotOpeationFillDO re:deviceList) {
+            re.setDeviceId(re.getId());
+        }
+        iotOpeationFillMapper.insertFill(deviceList);
+
+
+        System.out.println("*****************插入运行记录设备表完成***********************");
+    }
+
+}

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

@@ -67,8 +67,7 @@ import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_DEVICE_EXISTED;
-import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_DEVICE_NOT_EXISTS;
+import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.*;
 
 /**
  * 设备台账 Service 实现类
@@ -368,6 +367,9 @@ public class IotDeviceServiceImpl implements IotDeviceService {
 
     @Override
     public List<IotDeviceDO> getDevicesByDepts(IotDevicePageReqVO reqVO) {
+        if (CollUtil.isEmpty(reqVO.getDeviceIds()) && CollUtil.isEmpty(reqVO.getDeptIds())) {
+            throw new ServiceException(IOT_DEPT_NOT_SELECTED);
+        }
         AtomicReference<List<IotDeviceDO>> devices = new AtomicReference<>(new ArrayList<>());
         // 忽略数据权限
         DataPermissionUtils.executeIgnore(() -> {

+ 12 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotopeationfill/IotOpeationFillService.java

@@ -8,6 +8,8 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotmodeltemplateattrs.vo.Iot
 import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillSaveReqVO;
+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.iotcountdata.IotCountDataDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicecountdata.IotDeviceCountData;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicerunlog.IotDeviceRunLogDO;
@@ -46,6 +48,9 @@ public interface IotOpeationFillService {
      */
     void deleteIotOpeationFill(Long id);
 
+    int upFill1(IotOpeationFillSaveReqVO vo);
+    int upFill2(IotOpeationFillSaveReqVO vo);
+
     /**
      * 获得运行记录填报
      *
@@ -64,7 +69,7 @@ public interface IotOpeationFillService {
      */
     PageResult<IotOpeationFillDO> getIotOpeationFillPage(IotOpeationFillPageReqVO pageReqVO);
 
-    List<IotOpeationFillDO> getFillDevices();
+    List<IotOpeationFillDO> getFillDevices(List<Long> deviceIds);
 
     List<IotModelTemplateAttrsDO> getAttrsById(IotModelTemplateAttrsRespVO vo);
 
@@ -77,6 +82,9 @@ public interface IotOpeationFillService {
     void syncWordOrderData(List<Long> deviceIds, List<Long> oldDeptIds, Long deptId);
 
     List<IotOpeationFillDO> fillListByDeptId(IotOpeationFillRespVO vo);
+
+    IotOpeationFillDO devListByOrderId(IotOpeationFillRespVO vo);
+
     List<IotOpeationFillDO> deviceList(IotOpeationFillRespVO vo);
 
     PageResult<IotOpeationFillOrderDO> fillList1(IotOpeationFillPageReqVO vo);
@@ -89,6 +97,7 @@ public interface IotOpeationFillService {
 
 
 
+
     int insertLog(List<IotDeviceRunLogDO> logDO);
 
     /**
@@ -119,6 +128,8 @@ public interface IotOpeationFillService {
 
     PageResult<IotOpeationFillOrderDO> fillRecords(IotOpeationFillPageReqVO vo);
 
+    PageResult<IotDeviceRespVO> getFillDevices1(IotOpeationFillPageReqVO vo);
+
     PageResult<IotDeviceCountData> deviceCountList(IotOpeationFillPageReqVO vo);
 
     List<IotCountDataDO> countList(IotCountDataDO dataDO);

+ 42 - 6
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotopeationfill/IotOpeationFillServiceImpl.java

@@ -4,6 +4,8 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotmodeltemplateattrs.vo.Iot
 import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillSaveReqVO;
+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.iotcountdata.IotCountDataDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicecountdata.IotDeviceCountData;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicerunlog.IotDeviceRunLogDO;
@@ -12,6 +14,7 @@ import cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFil
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillOrderDO;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotopeationfill.IotOpeationFillMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotopeationfill.IotOpeationFillOrderMapper;
+import cn.iocoder.yudao.module.system.service.dept.DeptService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.springframework.stereotype.Service;
@@ -25,9 +28,7 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 
 import java.time.LocalDate;
 import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -46,7 +47,8 @@ public class IotOpeationFillServiceImpl implements IotOpeationFillService {
     private IotOpeationFillMapper iotOpeationFillMapper;
     @Resource
     private IotOpeationFillOrderMapper iotOpeationFillOrderMapper;
-
+    @Resource
+    private DeptService deptService;
 
     @Override
     public Long createIotOpeationFill(IotOpeationFillSaveReqVO createReqVO) {
@@ -74,6 +76,19 @@ public class IotOpeationFillServiceImpl implements IotOpeationFillService {
         iotOpeationFillMapper.deleteById(id);
     }
 
+    @Override
+    public int upFill1(IotOpeationFillSaveReqVO vo) {
+        int a = iotOpeationFillMapper.upFill1(vo);
+        vo.setOrderId(vo.getId());
+        iotOpeationFillMapper.upFill2(vo);
+        return a;
+    }
+
+    @Override
+    public int upFill2(IotOpeationFillSaveReqVO vo) {
+        return iotOpeationFillMapper.upFill2(vo);
+    }
+
     private void validateIotOpeationFillExists(Long id) {
         if (iotOpeationFillMapper.selectById(id) == null) {
             throw exception(IOT_OPEATION_FILL_NOT_EXISTS);
@@ -97,8 +112,8 @@ public class IotOpeationFillServiceImpl implements IotOpeationFillService {
 
 
     @Override
-    public List<IotOpeationFillDO> getFillDevices() {
-        return iotOpeationFillMapper.getFillDevices();
+    public List<IotOpeationFillDO> getFillDevices(List<Long> deviceIds) {
+        return iotOpeationFillMapper.getFillDevices(deviceIds);
     }
 
     @Override
@@ -142,6 +157,11 @@ public class IotOpeationFillServiceImpl implements IotOpeationFillService {
         return iotOpeationFillMapper.fillListByDeptId(vo);
     }
 
+    @Override
+    public IotOpeationFillDO devListByOrderId(IotOpeationFillRespVO vo) {
+        return iotOpeationFillMapper.devListByOrderId(vo);
+    }
+
     @Override
     public List<IotOpeationFillDO> deviceList(IotOpeationFillRespVO vo) {
         return iotOpeationFillMapper.deviceList(vo);
@@ -173,6 +193,8 @@ public class IotOpeationFillServiceImpl implements IotOpeationFillService {
     }
 
 
+
+
     @Override
     public int insertLog(List<IotDeviceRunLogDO> logDO) {
         return iotOpeationFillMapper.insertLog(logDO);
@@ -224,6 +246,20 @@ public class IotOpeationFillServiceImpl implements IotOpeationFillService {
         return new PageResult<>(fillOrderDOIPage.getRecords(),fillOrderDOIPage.getTotal());
     }
 
+    @Override
+    public PageResult<IotDeviceRespVO> getFillDevices1(IotOpeationFillPageReqVO vo) {
+
+        Set<Long> idList = new HashSet<>();
+        if(Objects.nonNull(vo.getDeptId())){
+            idList =  deptService.getChildDeptIdListFromCache(vo.getDeptId());
+            idList.add(vo.getDeptId());
+        }
+
+
+        IPage<IotDeviceRespVO> fillOrderDOIPage = iotOpeationFillMapper.getFillDevices1(Page.of(vo.getPageNo(), vo.getPageSize()), idList);
+        return new PageResult<>(fillOrderDOIPage.getRecords(),fillOrderDOIPage.getTotal());
+    }
+
     @Override
     public PageResult<IotDeviceCountData> deviceCountList(IotOpeationFillPageReqVO vo) {
         IPage<IotDeviceCountData> countDataIPage = iotOpeationFillMapper.deviceCountList(Page.of(vo.getPageNo(),vo.getPageSize()),

+ 57 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotoperationplan/IotOperationPlanService.java

@@ -0,0 +1,57 @@
+package cn.iocoder.yudao.module.pms.service.iotoperationplan;
+
+import java.util.*;
+import javax.validation.*;
+import cn.iocoder.yudao.module.pms.controller.admin.iotoperationplan.vo.*;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationplan.IotOperationPlanDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+
+/**
+ * 运行记录计划 Service 接口
+ *
+ * @author 超级管理员
+ */
+public interface IotOperationPlanService {
+
+    /**
+     * 创建运行记录计划
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createIotOperationPlan(@Valid IotOperationPlanSaveReqVO createReqVO);
+
+    /**
+     * 更新运行记录计划
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateIotOperationPlan(@Valid IotOperationPlanSaveReqVO updateReqVO);
+
+    /**
+     * 删除运行记录计划
+     *
+     * @param id 编号
+     */
+    void deleteIotOperationPlan(Long id);
+
+    /**
+     * 获得运行记录计划
+     *
+     * @param id 编号
+     * @return 运行记录计划
+     */
+    IotOperationPlanDO getIotOperationPlan(Long id);
+
+    /**
+     * 获得运行记录计划分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 运行记录计划分页
+     */
+    PageResult<IotOperationPlanDO> getIotOperationPlanPage(IotOperationPlanPageReqVO pageReqVO,Collection<Long> deptIds);
+
+    void updateInspectPlanStatus(Long id, Integer status);
+
+}

+ 98 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotoperationplan/IotOperationPlanServiceImpl.java

@@ -0,0 +1,98 @@
+package cn.iocoder.yudao.module.pms.service.iotoperationplan;
+
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationplandev.IotOperationPlanDevDO;
+import cn.iocoder.yudao.module.pms.dal.mysql.iotoperationplandev.IotOperationPlanDevMapper;
+import com.google.common.collect.ImmutableBiMap;
+import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import cn.iocoder.yudao.module.pms.controller.admin.iotoperationplan.vo.*;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationplan.IotOperationPlanDO;
+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 cn.iocoder.yudao.module.pms.dal.mysql.iotoperationplan.IotOperationPlanMapper;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_OPERATION_PLAN_NOT_EXISTS;
+
+
+/**
+ * 运行记录计划 Service 实现类
+ *
+ * @author 超级管理员
+ */
+@Service
+@Validated
+public class IotOperationPlanServiceImpl implements IotOperationPlanService {
+
+    @Resource
+    private IotOperationPlanMapper iotOperationPlanMapper;
+    @Resource
+    private IotOperationPlanDevMapper planDevMapper;
+
+    @Override
+    public Long createIotOperationPlan(IotOperationPlanSaveReqVO createReqVO) {
+        // 插入
+        IotOperationPlanDO iotOperationPlan = BeanUtils.toBean(createReqVO, IotOperationPlanDO.class);
+        iotOperationPlanMapper.insert(iotOperationPlan);
+        // 返回
+        for (IotOperationPlanDevDO planDevDO:createReqVO.getPlanDevList()) {
+            planDevDO.setPlanId(iotOperationPlan.getId());
+        }
+        planDevMapper.insertBatch(createReqVO.getPlanDevList());
+        return iotOperationPlan.getId();
+    }
+
+    @Override
+    public void updateIotOperationPlan(IotOperationPlanSaveReqVO updateReqVO) {
+        // 校验存在
+        validateIotOperationPlanExists(updateReqVO.getId());
+        // 更新
+        IotOperationPlanDO updateObj = BeanUtils.toBean(updateReqVO, IotOperationPlanDO.class);
+        iotOperationPlanMapper.updateById(updateObj);
+        int del = planDevMapper.delByPlanId(updateReqVO.getId());
+        if(del>0){
+            for (IotOperationPlanDevDO planDevDO:updateReqVO.getPlanDevList()) {
+                planDevDO.setPlanId(updateReqVO.getId());
+            }
+            planDevMapper.insertBatch(updateReqVO.getPlanDevList());
+        }
+
+    }
+
+    @Override
+    public void deleteIotOperationPlan(Long id) {
+        // 校验存在
+        validateIotOperationPlanExists(id);
+        // 删除
+        iotOperationPlanMapper.deleteById(id);
+    }
+
+    private void validateIotOperationPlanExists(Long id) {
+        if (iotOperationPlanMapper.selectById(id) == null) {
+            throw exception(IOT_OPERATION_PLAN_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public IotOperationPlanDO getIotOperationPlan(Long id) {
+        return iotOperationPlanMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<IotOperationPlanDO> getIotOperationPlanPage(IotOperationPlanPageReqVO pageReqVO,Collection<Long> deptIds) {
+        return iotOperationPlanMapper.selectPage(pageReqVO,deptIds);
+    }
+
+    @Override
+    public void updateInspectPlanStatus(Long id, Integer status) {
+        IotOperationPlanDO planDO = iotOperationPlanMapper.selectById(id).setStatus(status);
+        iotOperationPlanMapper.updateById(planDO);
+    }
+
+}

+ 55 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotoperationplandev/IotOperationPlanDevService.java

@@ -0,0 +1,55 @@
+package cn.iocoder.yudao.module.pms.service.iotoperationplandev;
+
+import java.util.*;
+import javax.validation.*;
+import cn.iocoder.yudao.module.pms.controller.admin.iotoperationplandev.vo.*;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationplandev.IotOperationPlanDevDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+
+/**
+ * 运行记录计划设备 Service 接口
+ *
+ * @author 超级管理员
+ */
+public interface IotOperationPlanDevService {
+
+    /**
+     * 创建运行记录计划设备
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createIotOperationPlanDev(@Valid IotOperationPlanDevSaveReqVO createReqVO);
+
+    /**
+     * 更新运行记录计划设备
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateIotOperationPlanDev(@Valid IotOperationPlanDevSaveReqVO updateReqVO);
+
+    /**
+     * 删除运行记录计划设备
+     *
+     * @param id 编号
+     */
+    void deleteIotOperationPlanDev(Long id);
+
+    /**
+     * 获得运行记录计划设备
+     *
+     * @param id 编号
+     * @return 运行记录计划设备
+     */
+    IotOperationPlanDevDO getIotOperationPlanDev(Long id);
+
+    /**
+     * 获得运行记录计划设备分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 运行记录计划设备分页
+     */
+    PageResult<IotOperationPlanDevDO> getIotOperationPlanDevPage(IotOperationPlanDevPageReqVO pageReqVO);
+
+}

+ 76 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotoperationplandev/IotOperationPlanDevServiceImpl.java

@@ -0,0 +1,76 @@
+package cn.iocoder.yudao.module.pms.service.iotoperationplandev;
+
+import cn.iocoder.yudao.module.pms.dal.mysql.iotoperationplandev.IotOperationPlanDevMapper;
+import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import cn.iocoder.yudao.module.pms.controller.admin.iotoperationplandev.vo.*;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationplandev.IotOperationPlanDevDO;
+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 static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_OPERATION_PLAN_DEV_NOT_EXISTS;
+
+
+/**
+ * 运行记录计划设备 Service 实现类
+ *
+ * @author 超级管理员
+ */
+@Service
+@Validated
+public class IotOperationPlanDevServiceImpl implements IotOperationPlanDevService {
+
+    @Resource
+    private IotOperationPlanDevMapper iotOperationPlanDevMapper;
+
+    @Override
+    public Long createIotOperationPlanDev(IotOperationPlanDevSaveReqVO createReqVO) {
+        // 插入
+        IotOperationPlanDevDO iotOperationPlanDev = BeanUtils.toBean(createReqVO, IotOperationPlanDevDO.class);
+        iotOperationPlanDevMapper.insert(iotOperationPlanDev);
+        // 返回
+        return iotOperationPlanDev.getId();
+    }
+
+    @Override
+    public void updateIotOperationPlanDev(IotOperationPlanDevSaveReqVO updateReqVO) {
+        // 校验存在
+        validateIotOperationPlanDevExists(updateReqVO.getId());
+        // 更新
+        IotOperationPlanDevDO updateObj = BeanUtils.toBean(updateReqVO, IotOperationPlanDevDO.class);
+        iotOperationPlanDevMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteIotOperationPlanDev(Long id) {
+        // 校验存在
+        validateIotOperationPlanDevExists(id);
+        // 删除
+        iotOperationPlanDevMapper.deleteById(id);
+    }
+
+    private void validateIotOperationPlanDevExists(Long id) {
+        if (iotOperationPlanDevMapper.selectById(id) == null) {
+            throw exception(IOT_OPERATION_PLAN_DEV_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public IotOperationPlanDevDO getIotOperationPlanDev(Long id) {
+        return iotOperationPlanDevMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<IotOperationPlanDevDO> getIotOperationPlanDevPage(IotOperationPlanDevPageReqVO pageReqVO) {
+        return iotOperationPlanDevMapper.selectPage(pageReqVO);
+    }
+
+}

+ 80 - 14
yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotOpeationFillMapper.xml

@@ -33,6 +33,12 @@
             c.deleted = 0
           and
             d.deleted = 0
+        <if test="deviceIds != null and !deviceIds.isEmpty()">
+            and c.id  in
+            <foreach collection="deviceIds" item="id" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+        </if>
     </select>
 
     <select id="getFillById" parameterType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO"
@@ -42,8 +48,7 @@
 
 
     <select id="getFillDevices1"
-            resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO">
-
+            resultType="cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO">
         select
             distinct
             c.id,
@@ -51,26 +56,46 @@
             c.device_code,
             c.device_name,
             b.device_category_id,
-            d.person_id user_id
+            d.person_id user_id,
+            e.name dept_name,
+            f.nickname,
+            g.name,
+            c.device_status
         from
             rq_iot_model_template a,
             rq_iot_model_template_attrs b,
             rq_iot_device c,
-            rq_iot_device_person d
+            rq_iot_device_person d,
+            system_dept e,
+            system_users f,
+            rq_iot_product_classify g
         where
-            a.device_category_id = b.device_category_id
-          and
-            a.device_category_id = c.asset_class
-          and
-            c.id = d.device_id
-          and
-            c.device_status in ('sg','dm')
+        a.device_category_id = b.device_category_id
+        and
+        a.device_category_id = c.asset_class
+        and
+        c.id = d.device_id
+        and
+        c.dept_id = e.id
+        and
+        d.person_id = f.id
+        and
+        a.device_category_id = g.id
+        and
+        c.device_status in ('sg','dm')
+        and
+        a.deleted = 0
+        and
+        c.deleted = 0
+        and
+        d.deleted = 0
         <if test="deviceIds != null and !deviceIds.isEmpty()">
-            and c.id in
+            and e.id in
             <foreach collection="deviceIds" item="id" open="(" separator="," close=")">
                 #{id}
             </foreach>
         </if>
+        order by c.dept_id
     </select>
 
 
@@ -157,6 +182,23 @@
     </update>
 
 
+    <update id="upFill1" parameterType="cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillSaveReqVO">
+        update rq_iot_opeation_fill_order
+        set order_status = '3',
+        reason = #{reason}
+        where
+        id = #{id}
+    </update>
+
+
+    <update id="upFill2" parameterType="cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillSaveReqVO">
+        update rq_iot_opeation_fill
+        set is_fill = '3'
+        where
+            order_id = #{id}
+    </update>
+
+
     <select id="deviceList" parameterType="cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillRespVO"
             resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO">
         select device_id from
@@ -255,6 +297,20 @@
         </if>
     </select>
 
+    <select id="devListByOrderId" parameterType="cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillRespVO"
+            resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO">
+        SELECT
+            COUNT(*) AS allDev,  -- 总数量
+            SUM(CASE WHEN is_fill = 1 THEN 1 ELSE 0 END) AS fillDev,  -- is_fill为1的数量
+            SUM(CASE WHEN is_fill = 0 THEN 1 ELSE 0 END) AS unFillDev  -- is_fill为0的数量
+        FROM
+            rq_iot_opeation_fill
+        WHERE
+            order_id = #{orderId}
+    </select>
+
+
+
     <select id="fillRecords" parameterType="cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillPageReqVO"
             resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillOrderDO">
         SELECT a.*
@@ -376,6 +432,12 @@
             on
                 b.dept_id = c.id
         where b.id is not null
+        <if test="deviceIds != null and !deviceIds.isEmpty()">
+            and a.device_id  in
+            <foreach collection="deviceIds" item="id" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+        </if>
     </select>
 
     <select id="fillList1" parameterType="cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillRespVO"
@@ -584,7 +646,8 @@
         COALESCE(total_count, 0) AS total_count,
         COALESCE(filled_count, 0) AS filled_count,
         COALESCE(unfilled_count, 0) AS unfilled_count,
-        COALESCE(filling_count, 0) AS filling_count
+        COALESCE(filling_count, 0) AS filling_count,
+        COALESCE(ignore_count, 0) AS ignore_count
         FROM (
         -- 第一行:汇总数据
         SELECT
@@ -594,6 +657,7 @@
         SUM(CASE WHEN o.order_status = 1 THEN 1 ELSE 0 END) AS filled_count,
         SUM(CASE WHEN o.order_status = 0 THEN 1 ELSE 0 END) AS unfilled_count,
         SUM(CASE WHEN o.order_status = 2 THEN 1 ELSE 0 END) AS filling_count,
+        SUM(CASE WHEN o.order_status = 3 THEN 1 ELSE 0 END) AS ignore_count,
         0 AS sort_order -- 确保汇总数据排在第一行
         FROM rq_iot_opeation_fill_order o
         WHERE o.deleted = 0
@@ -629,6 +693,7 @@
         SUM(CASE WHEN o.order_status = 1 THEN 1 ELSE 0 END) AS filled_count,
         SUM(CASE WHEN o.order_status = 0 THEN 1 ELSE 0 END) AS unfilled_count,
         SUM(CASE WHEN o.order_status = 2 THEN 1 ELSE 0 END) AS filling_count,
+        SUM(CASE WHEN o.order_status = 3 THEN 1 ELSE 0 END) AS ignore_count,
         1 AS sort_order -- 子部门数据排在后面
         FROM system_dept d
         LEFT JOIN rq_iot_opeation_fill_order o
@@ -672,7 +737,8 @@
         SELECT
         COUNT(*) AS total_count,
         SUM(CASE WHEN is_fill = 1 THEN 1 ELSE 0 END) AS filled_count,
-        COUNT(*) - SUM(CASE WHEN is_fill = 1 THEN 1 ELSE 0 END) AS unfilled_count
+        SUM(CASE WHEN is_fill = 3 THEN 1 ELSE 0 END) AS ignore_count,
+        COUNT(*) - SUM(CASE WHEN is_fill = 1 THEN 1 ELSE 0 END)-SUM(CASE WHEN is_fill = 3 THEN 1 ELSE 0 END) AS unfilled_count
         from(
         select
         distinct

+ 28 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotOperationPlanDevMapper.xml

@@ -0,0 +1,28 @@
+<?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.iotoperationplandev.IotOperationPlanDevMapper">
+
+    <!--
+        一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
+        无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
+        代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
+        文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
+     -->
+
+    <delete id="delByPlanId" parameterType="Long">
+        delete from rq_iot_operation_plan_dev where plan_id = #{planId}
+    </delete>
+
+
+    <select id="devIdList" resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationplandev.IotOperationPlanDevDO">
+        select * from rq_iot_operation_plan_dev
+        where 1=1
+        <if test="planIds != null and !planIds.isEmpty()">
+            and plan_id  in
+            <foreach collection="planIds" item="id" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+        </if>
+    </select>
+
+</mapper>

+ 17 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotOperationPlanMapper.xml

@@ -0,0 +1,17 @@
+<?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.iotoperationplan.IotOperationPlanMapper">
+
+    <!--
+        一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
+        无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
+        代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
+        文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
+     -->
+
+
+    <select id="getPlanList" resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationplan.IotOperationPlanDO">
+        select * from rq_iot_operation_plan where status = '0' and deleted = '0'
+    </select>
+
+</mapper>