Sfoglia il codice sorgente

Merge branch 'test' of http://1.94.244.160:3000/shuzhihua/pms-iot into test

zhangcl 5 giorni fa
parent
commit
c4b42c4afe
33 ha cambiato i file con 1152 aggiunte e 450 eliminazioni
  1. 2 1
      yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/task/BpmProcessInstanceApi.java
  2. 6 0
      yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/api/task/BpmProcessInstanceApiImpl.java
  3. 1 1
      yudao-module-pms/yudao-module-pms-api/src/main/java/cn/iocoder/yudao/module/pms/enums/common/IotDeviceStatusEnum.java
  4. 1 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/constant/PmsConstants.java
  5. 2 2
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/IotDeviceController.java
  6. 97 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/alarm/IotAlarmSettingController.java
  7. 43 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/alarm/vo/IotAlarmSettingPageReqVO.java
  8. 53 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/alarm/vo/IotAlarmSettingRespVO.java
  9. 42 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/alarm/vo/IotAlarmSettingSaveReqVO.java
  10. 26 6
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/failure/IotFailureReportController.java
  11. 3 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotopeationfill/IotOpeationFillController.java
  12. 4 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintain/IotMaintainController.java
  13. 63 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/alarm/IotAlarmSettingDO.java
  14. 2 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/IotDeviceMapper.java
  15. 33 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/alarm/IotAlarmSettingMapper.java
  16. 11 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotopeationfill/IotOpeationFillMapper.java
  17. 246 192
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/job/IotOperationPlanJob.java
  18. 3 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/job/MapLngLatJob.java
  19. 9 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/message/PmsMessage.java
  20. 1 1
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/IotDeviceService.java
  21. 13 2
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/IotDeviceServiceImpl.java
  22. 56 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/alarm/IotAlarmSettingService.java
  23. 76 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/alarm/IotAlarmSettingServiceImpl.java
  24. 78 38
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/failure/IotFailureReportServiceImpl.java
  25. 47 4
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotopeationfill/IotOpeationFillServiceImpl.java
  26. 1 0
      yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/maintain/IotMaintainServiceImpl.java
  27. 2 0
      yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotDeviceRunLogMapper.xml
  28. 10 0
      yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotMainWorkOrderMapper.xml
  29. 216 195
      yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotOpeationFillMapper.xml
  30. 0 3
      yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotOperationPlanMapper.xml
  31. 1 1
      yudao-server/src/main/resources/application-dev.yaml
  32. 3 0
      yudao-server/src/main/resources/application-prod.yaml
  33. 1 1
      yudao-server/src/main/resources/application-test.yaml

+ 2 - 1
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/api/task/BpmProcessInstanceApi.java

@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.bpm.api.task;
 import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
 
 import javax.validation.Valid;
+import java.util.Map;
 
 /**
  * 流程实例 Api 接口
@@ -21,5 +22,5 @@ public interface BpmProcessInstanceApi {
     String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO reqDTO);
 
 
-
+    void updateProcessVariables(String processId, Map<String, Object> variables);
 }

+ 6 - 0
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/api/task/BpmProcessInstanceApiImpl.java

@@ -7,6 +7,7 @@ import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
 import javax.validation.Valid;
+import java.util.Map;
 
 /**
  * Flowable 流程实例 Api 实现类
@@ -26,4 +27,9 @@ public class BpmProcessInstanceApiImpl implements BpmProcessInstanceApi {
         return processInstanceService.createProcessInstance(userId, reqDTO);
     }
 
+    @Override
+    public void updateProcessVariables(String processId, Map<String, Object> variables) {
+        processInstanceService.updateProcessInstanceVariables(processId, variables);
+    }
+
 }

+ 1 - 1
yudao-module-pms/yudao-module-pms-api/src/main/java/cn/iocoder/yudao/module/pms/enums/common/IotDeviceStatusEnum.java

@@ -11,7 +11,7 @@ import org.slf4j.LoggerFactory;
  * @Date
  */
 public enum IotDeviceStatusEnum {
-    fc("封存"), dby("待保养"), wxz("维修中"), bf("报废"), xz("闲置"), sg("施工"), dq("动迁"), dm("待命");
+    fc("封存"), dby("待保养"), wxz("维修中"), bf("报废"), xz("闲置"), sg("施工"), dq("动迁"), dm("待命"),zddm("驻地待命"),wg("完工"),xcdm("现场待命"),zb("准备"),dwx("待维修"),gcsy("观察使用");
     private String msg;
 
     IotDeviceStatusEnum(String msg) {

+ 1 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/constant/PmsConstants.java

@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.pms.constant;
 public interface PmsConstants {
     String GENERATE_INSPECT = "generateInspect";
     String GENERATE_MAINTAIN = "generateMaintain";
+    String FAILURE_NO_PASS = "failureNoPass";
     String GENERATE_MAINTAIN_TEMPLATE = "generate-maintain";
     String GENERATE_MAINTENANCE = "generateMaintenance";
     String FAILURE_REPORT = "failureReport";

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

@@ -556,8 +556,8 @@ public class IotDeviceController {
 
     @GetMapping("/map")
     @Operation(summary = "查询地图设备")
-    public CommonResult<List<IotDeviceDO>> getMap(){
-        List<IotDeviceDO> mapDevice = iotDeviceService.getMapDevice();
+    public CommonResult<List<IotDeviceDO>> getMap(@Valid IotDevicePageReqVO pageReqVO){
+        List<IotDeviceDO> mapDevice = iotDeviceService.getMapDevice(pageReqVO);
         List<IotDeviceDO> collect = mapDevice.stream().filter(e -> Objects.nonNull(e.getLng()) && Objects.nonNull(e.getLat())).collect(Collectors.toList());
         return CommonResult.success(collect);
     }

+ 97 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/alarm/IotAlarmSettingController.java

@@ -0,0 +1,97 @@
+package cn.iocoder.yudao.module.pms.controller.admin.alarm;
+
+import cn.iocoder.yudao.module.pms.controller.admin.alarm.vo.IotAlarmSettingPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.alarm.vo.IotAlarmSettingRespVO;
+import cn.iocoder.yudao.module.pms.controller.admin.alarm.vo.IotAlarmSettingSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.alarm.IotAlarmSettingDO;
+import cn.iocoder.yudao.module.pms.service.alarm.IotAlarmSettingService;
+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.*;
+
+
+@Tag(name = "管理后台 - 告警设置")
+@RestController
+@RequestMapping("/rq/iot-alarm-setting")
+@Validated
+public class IotAlarmSettingController {
+
+    @Resource
+    private IotAlarmSettingService iotAlarmSettingService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建告警设置")
+    @PreAuthorize("@ss.hasPermission('rq:iot-alarm-setting:create')")
+    public CommonResult<Long> createIotAlarmSetting(@Valid @RequestBody IotAlarmSettingSaveReqVO createReqVO) {
+        return success(iotAlarmSettingService.createIotAlarmSetting(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新告警设置")
+    @PreAuthorize("@ss.hasPermission('rq:iot-alarm-setting:update')")
+    public CommonResult<Boolean> updateIotAlarmSetting(@Valid @RequestBody IotAlarmSettingSaveReqVO updateReqVO) {
+        iotAlarmSettingService.updateIotAlarmSetting(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除告警设置")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('rq:iot-alarm-setting:delete')")
+    public CommonResult<Boolean> deleteIotAlarmSetting(@RequestParam("id") Long id) {
+        iotAlarmSettingService.deleteIotAlarmSetting(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得告警设置")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('rq:iot-alarm-setting:query')")
+    public CommonResult<IotAlarmSettingRespVO> getIotAlarmSetting(@RequestParam("id") Long id) {
+        IotAlarmSettingDO iotAlarmSetting = iotAlarmSettingService.getIotAlarmSetting(id);
+        return success(BeanUtils.toBean(iotAlarmSetting, IotAlarmSettingRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得告警设置分页")
+    @PreAuthorize("@ss.hasPermission('rq:iot-alarm-setting:query')")
+    public CommonResult<PageResult<IotAlarmSettingRespVO>> getIotAlarmSettingPage(@Valid IotAlarmSettingPageReqVO pageReqVO) {
+        PageResult<IotAlarmSettingDO> pageResult = iotAlarmSettingService.getIotAlarmSettingPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, IotAlarmSettingRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出告警设置 Excel")
+    @PreAuthorize("@ss.hasPermission('rq:iot-alarm-setting:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportIotAlarmSettingExcel(@Valid IotAlarmSettingPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<IotAlarmSettingDO> list = iotAlarmSettingService.getIotAlarmSettingPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "告警设置.xls", "数据", IotAlarmSettingRespVO.class,
+                        BeanUtils.toBean(list, IotAlarmSettingRespVO.class));
+    }
+
+}

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

@@ -0,0 +1,43 @@
+package cn.iocoder.yudao.module.pms.controller.admin.alarm.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 IotAlarmSettingPageReqVO extends PageParam {
+
+    @Schema(description = "分类id", example = "20512")
+    private Long classifyId;
+
+    @Schema(description = "分类名称", example = "芋艿")
+    private String classifyName;
+
+    @Schema(description = "设备id", example = "4633")
+    private Long deviceId;
+
+    @Schema(description = "设备名称", example = "芋艿")
+    private String deviceName;
+
+    @Schema(description = "上限")
+    private String maxValue;
+
+    @Schema(description = "下限")
+    private String minValue;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+    @Schema(description = "告警属性")
+    private Integer alarmProperty;
+
+}

+ 53 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/alarm/vo/IotAlarmSettingRespVO.java

@@ -0,0 +1,53 @@
+package cn.iocoder.yudao.module.pms.controller.admin.alarm.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 IotAlarmSettingRespVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "32172")
+    @ExcelProperty("主键id")
+    private Long id;
+
+    @Schema(description = "分类id", example = "20512")
+    @ExcelProperty("分类id")
+    private Long classifyId;
+
+    @Schema(description = "分类名称", example = "芋艿")
+    @ExcelProperty("分类名称")
+    private String classifyName;
+
+    @Schema(description = "设备id", example = "4633")
+    @ExcelProperty("设备id")
+    private Long deviceId;
+
+    @Schema(description = "设备名称", example = "芋艿")
+    @ExcelProperty("设备名称")
+    private String deviceName;
+
+    @Schema(description = "上限", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("上限")
+    private String maxValue;
+
+    @Schema(description = "下限", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("下限")
+    private String minValue;
+
+    @Schema(description = "创建时间")
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "告警属性")
+    @ExcelProperty("告警属性")
+    private String alarmProperty;
+
+    @Schema(description = "属性标识")
+    private String propertyCode;
+}

+ 42 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/alarm/vo/IotAlarmSettingSaveReqVO.java

@@ -0,0 +1,42 @@
+package cn.iocoder.yudao.module.pms.controller.admin.alarm.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 IotAlarmSettingSaveReqVO {
+
+    @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "32172")
+    private Long id;
+
+    @Schema(description = "分类id", example = "20512")
+    private Long classifyId;
+
+    @Schema(description = "分类名称", example = "芋艿")
+    private String classifyName;
+
+    @Schema(description = "设备id", example = "4633")
+    private Long deviceId;
+
+    @Schema(description = "设备名称", example = "芋艿")
+    private String deviceName;
+
+    @Schema(description = "上限", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotEmpty(message = "上限不能为空")
+    private String maxValue;
+
+    @Schema(description = "下限", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotEmpty(message = "下限不能为空")
+    private String minValue;
+
+    @Schema(description = "告警属性")
+    @NotEmpty(message = "告警属性不能为空")
+    private String alarmProperty;
+
+    @Schema(description = "属性标识")
+    @NotEmpty(message = "属性标识不能为空")
+    private String propertyCode;
+}

+ 26 - 6
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/failure/IotFailureReportController.java

@@ -1,12 +1,17 @@
 package cn.iocoder.yudao.module.pms.controller.admin.failure;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
 import cn.iocoder.yudao.module.pms.controller.admin.failure.vo.IotFailureReportPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.failure.vo.IotFailureReportProcessVO;
 import cn.iocoder.yudao.module.pms.controller.admin.failure.vo.IotFailureReportRespVO;
 import cn.iocoder.yudao.module.pms.controller.admin.failure.vo.IotFailureReportSaveReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotdeviceperson.vo.IotDevicePersonRelationSaveReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.maintain.vo.IotMaintainSaveVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.failure.IotFailureReportDO;
+import cn.iocoder.yudao.module.pms.service.IotDeviceService;
 import cn.iocoder.yudao.module.pms.service.failure.IotFailureReportService;
+import cn.iocoder.yudao.module.pms.service.iotdeviceperson.IotDevicePersonService;
 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -45,6 +50,12 @@ public class IotFailureReportController {
     private IotFailureReportService iotFailureReportService;
     @Autowired
     private AdminUserApi adminUserApi;
+    @Autowired
+    private BpmProcessInstanceApi bpmProcessInstanceApi;
+    @Autowired
+    private IotDeviceService iotDeviceService;
+    @Autowired
+    private IotDevicePersonService iotDevicePersonService;
 
     @PostMapping("/create")
     @Operation(summary = "创建故障上报")
@@ -124,12 +135,21 @@ public class IotFailureReportController {
     @PutMapping("/process-info")
     @Operation(summary = "故障上报更新流程信息")
     @PreAuthorize("@ss.hasPermission('rq:iot-failure-report:create')")
-    public CommonResult<Long> updateIotFailureReportProcess(@RequestParam("id")String id, @RequestParam("type") String type, @RequestParam("assigneeUserId") String assigneeUserId) {
-        IotFailureReportProcessVO iotFailureReportProcessVO = new IotFailureReportProcessVO();
-        iotFailureReportProcessVO.setId(id);
-        iotFailureReportProcessVO.setType(type);
-        iotFailureReportProcessVO.setAssigneeUserId(Long.valueOf(assigneeUserId));
-        return success(iotFailureReportService.updateIotFailureReportProcess(iotFailureReportProcessVO));
+    public CommonResult<String> updateIotFailureReportProcess(@RequestParam("processId") String processId,@RequestParam("id")String id, @RequestParam("type") String type,
+                                                            @RequestParam("assigneeUserId") String assigneeUserId,@RequestParam("trans") String trans) {
+        if ("true".equals(trans)) {
+            Map<String, Object> params = new HashMap<>();
+            IotFailureReportProcessVO iotFailureReportProcessVO = new IotFailureReportProcessVO();
+            iotFailureReportProcessVO.setId(id);
+            iotFailureReportProcessVO.setType(type);
+            iotFailureReportProcessVO.setAssigneeUserId(Long.valueOf(assigneeUserId));
+            params.put("continue", "1");
+            bpmProcessInstanceApi.updateProcessVariables(processId, params);
+            iotFailureReportService.updateIotFailureReportProcess(iotFailureReportProcessVO);
+            return success("完成");
+        } else {
+            return success("完成");
+        }
     }
 
     @GetMapping("/get/approval")

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

@@ -269,6 +269,9 @@ public class IotOpeationFillController {
                 IotRyDailyReportSaveReqVO saveReqVO1 = BeanUtil.mapToBean(stringRyObjectMap, IotRyDailyReportSaveReqVO.class,false);
                 saveReqVO1.setDeptId(fillDO1.getDeptId());
                 saveReqVO1.setFillOrderCreateTime(fillList.get(0).getCreateTime().atStartOfDay());
+                if(fillDO1.getDeviceCategoryId()==228){
+                    saveReqVO1.setProjectClassification("2");
+                }
                 iotRyDailyReportService.createIotRyDailyReport(saveReqVO1);
             }
 

+ 4 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/maintain/IotMaintainController.java

@@ -196,6 +196,10 @@ public class IotMaintainController {
         }
         List<AdminUserRespDTO> userListByDeptId = adminUserApi.getUserListByDeptId(iotFailureReportDO.getDeptId());
         userListByDept.addAll(userListByDeptId);
+        if (StringUtils.isNotBlank(iotFailureReportDO.getCreator())&&Objects.nonNull(iotFailureReportDO.getCreator())) {
+            AdminUserRespDTO creator = adminUserApi.getUser(Long.valueOf(iotFailureReportDO.getCreator()));
+            userListByDept.add(creator);
+        }
         return success(userListByDept);
 
     }

+ 63 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/alarm/IotAlarmSettingDO.java

@@ -0,0 +1,63 @@
+package cn.iocoder.yudao.module.pms.dal.dataobject.alarm;
+
+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_alarm_setting")
+@KeySequence("rq_iot_alarm_setting_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class IotAlarmSettingDO extends BaseDO {
+
+    /**
+     * 主键id
+     */
+    @TableId
+    private Long id;
+    /**
+     * 分类id
+     */
+    private Long classifyId;
+    /**
+     * 分类名称
+     */
+    private String classifyName;
+    /**
+     * 设备id
+     */
+    private Long deviceId;
+    /**
+     * 设备名称
+     */
+    private String deviceName;
+    /**
+     * 上限
+     */
+    private String maxValue;
+    /**
+     * 下限
+     */
+    private String minValue;
+    /**
+     * 告警属性
+     */
+    private String alarmProperty;
+
+    /**
+     * 属性标识
+     */
+    private String propertyCode;
+}

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

@@ -144,8 +144,9 @@ public interface IotDeviceMapper extends BaseMapperX<IotDeviceDO> {
         return selectList(queryWrapper);
     }
 
-    default List<IotDeviceDO> selectDataCollect() {
+    default List<IotDeviceDO> selectDataCollect(IotDevicePageReqVO reqVO) {
         return selectList(new LambdaQueryWrapperX<IotDeviceDO>()
+                .inIfPresent(IotDeviceDO::getDeptId, reqVO.getDeptIds())
                 .isNotNull(IotDeviceDO::getYfDeviceId));
     }
     default List<IotDeviceDO> selectSimpleList(IotDevicePageReqVO reqVO, Collection<Long> deptIds) {

+ 33 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/alarm/IotAlarmSettingMapper.java

@@ -0,0 +1,33 @@
+package cn.iocoder.yudao.module.pms.dal.mysql.alarm;
+
+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.controller.admin.alarm.vo.IotAlarmSettingPageReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.alarm.IotAlarmSettingDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 告警设置 Mapper
+ *
+ * @author 超级管理员
+ */
+@Mapper
+public interface IotAlarmSettingMapper extends BaseMapperX<IotAlarmSettingDO> {
+
+    default PageResult<IotAlarmSettingDO> selectPage(IotAlarmSettingPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<IotAlarmSettingDO>()
+                .eqIfPresent(IotAlarmSettingDO::getClassifyId, reqVO.getClassifyId())
+                .likeIfPresent(IotAlarmSettingDO::getClassifyName, reqVO.getClassifyName())
+                .eqIfPresent(IotAlarmSettingDO::getDeviceId, reqVO.getDeviceId())
+                .likeIfPresent(IotAlarmSettingDO::getDeviceName, reqVO.getDeviceName())
+                .eqIfPresent(IotAlarmSettingDO::getMaxValue, reqVO.getMaxValue())
+                .eqIfPresent(IotAlarmSettingDO::getMinValue, reqVO.getMinValue())
+                .betweenIfPresent(IotAlarmSettingDO::getCreateTime, reqVO.getCreateTime())
+                .eqIfPresent(IotAlarmSettingDO::getAlarmProperty, reqVO.getAlarmProperty())
+                .orderByDesc(IotAlarmSettingDO::getId));
+    }
+
+}

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

@@ -9,6 +9,7 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeati
 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.iotZHBD.DeviceZHBDDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotcountdata.IotCountDataDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicecountdata.IotDeviceCountData;
@@ -16,6 +17,7 @@ import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicerunlog.IotDeviceRunLo
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmodeltemplateattrs.IotModelTemplateAttrsDO;
 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.system.dal.dataobject.user.AdminUserDO;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -223,6 +225,9 @@ public interface IotOpeationFillMapper extends BaseMapperX<IotOpeationFillDO> {
     @TenantIgnore
     List<IotOpeationFillOrderDO> childList(IotOpeationFillOrderDO fillDO);
 
+    @TenantIgnore
+    IotDeviceDO devStatus(IotDeviceDO deviceDO) ;
+
     @TenantIgnore
     IotOpeationFillDO isReport(IotOpeationFillDO fillDO);
 
@@ -244,4 +249,10 @@ public interface IotOpeationFillMapper extends BaseMapperX<IotOpeationFillDO> {
     @TenantIgnore
     IotDeviceRunLogDO getDesc(IotDeviceRunLogDO runLogDO);
 
+    @TenantIgnore
+    IotDeviceRunLogDO getTeamType(IotDeviceRunLogDO runLogDO);
+
+    @TenantIgnore
+    AdminUserDO getUserInfo(IotDeviceRunLogDO runLogDO);
+
 }

+ 246 - 192
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/job/IotOperationPlanJob.java

@@ -6,8 +6,11 @@ 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.controller.admin.iotrhdailyreport.vo.IotRhDailyReportSaveReqVO;
 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.inspect.IotInspectPlanDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicerunlog.IotDeviceRunLogDO;
 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;
@@ -18,6 +21,8 @@ import cn.iocoder.yudao.module.pms.dal.mysql.iotoperationplan.IotOperationPlanMa
 import cn.iocoder.yudao.module.pms.dal.mysql.iotoperationplandev.IotOperationPlanDevMapper;
 import cn.iocoder.yudao.module.pms.message.PmsMessage;
 import cn.iocoder.yudao.module.pms.service.iotopeationfill.IotOpeationFillService;
+import cn.iocoder.yudao.module.pms.service.iotrhdailyreport.IotRhDailyReportService;
+import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
 import cn.iocoder.yudao.module.system.service.dept.DeptService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
@@ -26,9 +31,11 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
+import java.time.temporal.ChronoUnit;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -46,6 +53,7 @@ import static cn.iocoder.yudao.module.pms.framework.config.MultiThreadConfigurat
 public class IotOperationPlanJob implements JobHandler {
 
 
+
     @Autowired
     private IotOpeationFillMapper iotOpeationFillMapper;
     @Autowired
@@ -62,6 +70,8 @@ public class IotOperationPlanJob implements JobHandler {
     private DeptService deptService;
     @Resource
     private IotOpeationFillService opeationFillService;
+    @Resource
+    private IotRhDailyReportService iotRhDailyReportService;
     /**
      * 1、查询开启状态运行计划
      * 2、根据计划获取设备
@@ -74,15 +84,9 @@ public class IotOperationPlanJob implements JobHandler {
     @Override
     public String execute(String param) throws Exception {
         TenantContextHolder.setIgnore(true);
-
-
         //1、查询开启,非删除状态运行计划
         List<IotOperationPlanDO> planList = planMapper.getPlanList();
-
         if(planList.size()>0){
-
-
-
             for (IotOperationPlanDO planDO:planList) {
                 if (planDO.getLastCreateTime()==null&& Objects.nonNull(planDO.getBeginCreateTime())) {
                     //当首次执行时间大于当前时间
@@ -91,97 +95,52 @@ public class IotOperationPlanJob implements JobHandler {
                                 planDO.getBeginCreateTime().atZone(ZoneId.systemDefault()) // 使用系统默认时区
                                         .toInstant()                    // 转为 Instant(时间戳)
                         );
-
-
-                        Set<Long> idList = new HashSet<>();
-                        if(Objects.nonNull(planDO.getDeptId())){
-                            idList =  deptService.getChildDeptIdListFromCache(planDO.getDeptId());
-                            idList.add(planDO.getDeptId());
-                        }
-
-
-                        //2、根据计划获取设备ID
-                        List<IotDeviceRespVO> devList = iotOpeationFillMapper.getFillDevices2(idList);
-
-                        if(devList.size()>0){
-                            List<Long> devIdList= devList.stream().map(IotDeviceRespVO::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);
-
-                            }
-
-                            deal(planDO, date,devIdList,orderList);
-                        }
-
-
+                        extractedOrder(planDO, date);
                     }
                 } else {
                     Date lastdate = Date.from(
                             planDO.getLastCreateTime().atZone(ZoneId.systemDefault()) // 使用系统默认时区
                                     .toInstant()                    // 转为 Instant(时间戳)
                     );
-
-
-
-                    Set<Long> idList = new HashSet<>();
-                    if(Objects.nonNull(planDO.getDeptId())){
-                        idList =  deptService.getChildDeptIdListFromCache(planDO.getDeptId());
-                        idList.add(planDO.getDeptId());
-                    }
-
-
-                    //2、根据计划获取设备ID
-                    List<IotDeviceRespVO> devList = iotOpeationFillMapper.getFillDevices2(idList);
-                    if(devList.size()>0){
-                        List<Long> devIdList= devList.stream().map(IotDeviceRespVO::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);
-
-                        }
-
-
-                        deal(planDO, lastdate,devIdList,orderList);
-                    }
-
+                    extractedOrder(planDO, lastdate);
                 }
             }
-
-
-
         }
-
-
         return "创建成功";
     }
 
+    private void extractedOrder(IotOperationPlanDO planDO, Date date) {
+        Set<Long> idList = new HashSet<>();
+        if(Objects.nonNull(planDO.getDeptId())){
+            idList =  deptService.getChildDeptIdListFromCache(planDO.getDeptId());
+            idList.add(planDO.getDeptId());
+        }
+        //2、根据计划获取设备ID
+        List<IotDeviceRespVO> devList = iotOpeationFillMapper.getFillDevices2(idList);
+        if(devList.size()>0){
+            List<Long> devIdList= devList.stream().map(IotDeviceRespVO::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);
+            }
+            deal(planDO, date,devIdList,orderList);
+        }else{
+            //判断计划内是否所有队伍都是非施工状态且为瑞恒
+            //满足条件直接插入日报
+            unNormalTeamInPlan(planDO);
+        }
+    }
+
 
     private void deal(IotOperationPlanDO plan, Date date,List<Long> devIdList, List<IotOpeationFillOrderDO> orderList) {
         Date date1 = new Date();
@@ -189,19 +148,16 @@ public class IotOperationPlanJob implements JobHandler {
             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);
-
             }
         }
     }
@@ -209,153 +165,251 @@ public class IotOperationPlanJob implements JobHandler {
 
 
     private void extracted(List<Long> devIdList, List<IotOpeationFillOrderDO> orderList,IotOperationPlanDO plan) {
-        LocalDateTime localDateTime = DateUtils.contactTime(plan.getBeginCreateTime());
-        plan.setLastCreateTime(localDateTime);
+        //瑞鹰日报计划为12小时执行一次
+        //判断计划周期是否为小时,如果是,则保存上次执行时间为当前时间最近的整点
+        if ("hour".equals(plan.getPlanUnit())) {
+            // 获取当前时间
+            LocalDateTime now = LocalDateTime.now();
+            // 获取当前分钟数
+            int minute = now.getMinute();
+
+            LocalDateTime localDateTime;
+            if (minute <= 30) {
+                // 如果分钟数小于等于30,取当前小时的整点
+                localDateTime = now.truncatedTo(ChronoUnit.HOURS);
+            } else {
+                // 如果分钟数大于30,取下一小时的整点
+                localDateTime = now.truncatedTo(ChronoUnit.HOURS).plusHours(1);
+            }
+            plan.setLastCreateTime(localDateTime);
+        } else {
+            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);
 
 
+        Set<Long> ryIdList = new HashSet<>();
+        if(plan.getIsReport()==1){
 
-        Set<Long> rdIdList = new HashSet<>();
-        rdIdList =  deptService.getChildDeptIdListFromCache(163L);
-        rdIdList.add(163L);
-
-        Set<Long> rhIdList = new HashSet<>();
-        rhIdList =  deptService.getChildDeptIdListFromCache(157L);
-        rhIdList.add(157L);
-
-
-        boolean exist = rdIdList.contains(plan.getDeptId());
-
-        if(!exist){
+            ryIdList =  deptService.getChildDeptIdListFromCache(158L);
+            ryIdList.add(158L);
 
+            List<IotOpeationFillOrderDO> zxjOrderList = new ArrayList<>();
 
-            //瑞鹰SCP项目部50010队伍临时创建
-            if(plan.getDeptId()==292){
-                //筛选日报工单
-                List<IotOpeationFillOrderDO> virOrderList = new ArrayList<>();
-
-                IotOpeationFillOrderDO fillDO = new IotOpeationFillOrderDO();
-
-                fillDO.setOrderName("40006队"+"/"+LocalDate.now()+"运行记录填报");
-                fillDO.setDeptId(322L);
-                fillDO.setOrderStatus(0);
-                fillDO.setCreateTime(LocalDateTime.now());
-                fillDO.setUserName("李小虎");
-                fillDO.setUserId(486);
-                fillDO.setMobile(String.valueOf(17723897643L));
-                virOrderList.add(fillDO);
+            for (IotOpeationFillOrderDO orderDO:orderList1) {
+                IotDeviceRunLogDO runLogDO = new IotDeviceRunLogDO();
+                runLogDO.setDeptId(orderDO.getDeptId());
+                //获取队伍类型
+                IotDeviceRunLogDO teamType = iotOpeationFillMapper.getTeamType(runLogDO);
 
-                orderList1.addAll(virOrderList);
-                iotOpeationFillOrderMapper.insertBatch(virOrderList);
-                //创建日报设备
-                List <IotOpeationFillDO> devList = opeationFillService.reportMethod(virOrderList);
-                //插入日报设备
-                iotOpeationFillMapper.insertFill(devList);
-
-
-            }
-
-            boolean rhContain = rhIdList.contains(plan.getDeptId());
-
-            if(rhContain){
-                //2、瑞恒无指定队伍全部队伍插入日报设备
-                //筛选正常工单部门id
-                List<Long> deptIdList = orderList1.stream().map(IotOpeationFillOrderDO::getDeptId).collect(Collectors.toList());
-                //查询瑞恒所有责任人数据
-                Set<Long> pIdList = new HashSet<>();
-                pIdList =  deptService.getChildDeptIdListFromCache(plan.getDeptId());
-                pIdList.add(plan.getDeptId());
-                List<IotOpeationFillDO> rhPdList = iotOpeationFillMapper.pdListRh(pIdList);
-                //筛选与正常工单不同部门的责任人数据
-                List<IotOpeationFillDO> verRPList = rhPdList.stream().filter(e->!deptIdList.contains(e.getDeptId())).collect(Collectors.toList());
-                //筛选小队责任人数据
-                // 使用迭代器遍历集合
-                Iterator<IotOpeationFillDO> iterator = verRPList.iterator();
-                while (iterator.hasNext()) {
-                    IotOpeationFillDO rp = iterator.next();
-                    IotOpeationFillOrderDO rpOrder = new IotOpeationFillOrderDO();
-                    rpOrder.setDeptId(rp.getDeptId());
-                    List<IotOpeationFillOrderDO> childList = iotOpeationFillMapper.childList(rpOrder);
-
-                    // 当childList有元素时,通过迭代器删除当前元素
-                    if (childList.size() > 0) {
-                        iterator.remove(); // 使用迭代器的remove方法安全删除
+                //如果是钻井队伍,则日报工单责任人更新为技术员
+                //修井队伍不变
+                if(teamType!=null&&teamType.getPointCode().equals("zj")){
+                    //获取技术员信息
+                    AdminUserDO userInfo = iotOpeationFillMapper.getUserInfo(runLogDO);
+                    if(userInfo!=null){
+                        orderDO.setUserName(userInfo.getUsername());
+                        orderDO.setUserId(new BigDecimal(userInfo.getId()).intValue());
+                        orderDO.setMobile(userInfo.getMobile());
                     }
+                    zxjOrderList.add(orderDO);
+                }else if(teamType!=null&&teamType.getPointCode().equals("xj")){
+                    zxjOrderList.add(orderDO);
                 }
-                //创建虚拟工单
-                if(verRPList.size()>0){
-                    List<IotOpeationFillOrderDO> virOrderList = new ArrayList<>();
-                    for (IotOpeationFillDO pd:verRPList) {
-                        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());
-                        virOrderList.add(fillDO);
-                    }
-                    if(virOrderList.size()>0){
-                        orderList1.addAll(virOrderList);
-                        //插入虚拟工单工单
-                        iotOpeationFillOrderMapper.insertBatch(virOrderList);
+            }
 
+
+            // 按dept_id去重,保留第一个出现的元素
+            List<IotOpeationFillOrderDO> distinctOrderList = zxjOrderList.stream()
+                    .collect(Collectors.toMap(
+                            IotOpeationFillOrderDO::getDeptId,
+                            order -> {
+                                order.setId(null); // 关键:重置ID,避免与已有数据冲突
+                                return order;
+                            },
+                            (existing, replacement) -> existing
+                    ))
+                    .values()
+                    .stream()
+                    .collect(Collectors.toList());
+            //插入工单主表
+            iotOpeationFillOrderMapper.insertBatch(distinctOrderList);
+
+            boolean ryContain = ryIdList.contains(plan.getDeptId());
+            //瑞鹰日报插入
+            ryReportInsert(plan,distinctOrderList,ryContain);
+
+        }else{
+            ryIdList =  deptService.getChildDeptIdListFromCache(163L);
+            ryIdList.add(163L);
+            Set<Long> rhIdList = new HashSet<>();
+            rhIdList =  deptService.getChildDeptIdListFromCache(157L);
+            rhIdList.add(157L);
+            boolean exist = ryIdList.contains(plan.getDeptId());
+            if(!exist){
+                boolean rhContain = rhIdList.contains(plan.getDeptId());
+                //瑞恒日报插入
+                rhReportInsert(plan, orderList1, rhContain);
+            }
+            //发送钉钉消息
+            sendDingMessage(orderList1);
+            //正常工单设备
+            for (IotOpeationFillDO device:deviceList) {
+                for (IotOpeationFillOrderDO order:orderList1) {
+                    if(device.getUserId().intValue()==order.getUserId().intValue()){
+                        device.setOrderId(order.getId());
                     }
                 }
-                //创建日报设备
-                List <IotOpeationFillDO> devList = opeationFillService.reportMethod(orderList1);
-                //插入日报设备
-                iotOpeationFillMapper.insertFill(devList);
             }
+            //插入子表
+            for (IotOpeationFillDO re:deviceList) {
+                re.setDeviceId(re.getId());
+            }
+            iotOpeationFillMapper.insertFill(deviceList);
+        }
 
 
-        }
 
 
 
+    }
+
+    private void sendDingMessage(List<IotOpeationFillOrderDO> orderList1) {
         //发送钉钉通知
         pmsThreadPoolTaskExecutor.execute(()->{
             try{
-                for (IotOpeationFillOrderDO order:orderList1) {
+                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) {
-            for (IotOpeationFillOrderDO order:orderList1) {
-                if(device.getUserId().intValue()==order.getUserId().intValue()){
-                    device.setOrderId(order.getId());
+    private void unNormalTeamInPlan(IotOperationPlanDO planDO) {
+        Set<Long> rhIdList = new HashSet<>();
+        rhIdList =  deptService.getChildDeptIdListFromCache(157L);
+        rhIdList.add(157L);
+        boolean a = rhIdList.contains(planDO.getDeptId());
+        if(a){
+            Set<Long> deptIdList = new HashSet<>();
+            deptIdList =  deptService.getChildDeptIdListFromCache(planDO.getDeptId());
+            if(deptIdList.size()>0){
+                for (Long vir:deptIdList) {
+                    IotRhDailyReportSaveReqVO saveReqVO = new IotRhDailyReportSaveReqVO();
+                    //查询队伍增压机状态
+                    IotDeviceDO virDev = new IotDeviceDO();
+                    virDev.setDeptId(vir);
+                    IotDeviceDO devStatus = iotOpeationFillMapper.devStatus(virDev);
+                    //不为空则为日报赋值
+                    if(devStatus!=null){
+                        saveReqVO.setConstructionStatus(devStatus.getDeviceStatus());
+                    }
+                    //当日注气量
+                    saveReqVO.setDailyGasInjection(BigDecimal.valueOf(0.00));
+                    //当日注水量
+                    saveReqVO.setDailyWaterInjection(BigDecimal.valueOf(0.00));
+                    //当日注气时间
+                    saveReqVO.setDailyInjectGasTime(BigDecimal.valueOf(0.00));
+                    //当日注水时间
+                    saveReqVO.setDailyInjectWaterTime(BigDecimal.valueOf(0.00));
+                    //当日用电量
+                    saveReqVO.setDailyPowerUsage(BigDecimal.valueOf(0.00));
+                    //非生产时间
+                    saveReqVO.setNonProductionTime(BigDecimal.valueOf(0.00));
+                    saveReqVO.setDeptId(vir);
+                    saveReqVO.setFillOrderCreateTime(LocalDateTime.now());
+                    iotRhDailyReportService.createIotRhDailyReport(saveReqVO);
                 }
             }
         }
+    }
 
-        //插入子表
-        for (IotOpeationFillDO re:deviceList) {
-            re.setDeviceId(re.getId());
-        }
-        iotOpeationFillMapper.insertFill(deviceList);
 
+    private void ryReportInsert(IotOperationPlanDO plan, List<IotOpeationFillOrderDO> orderList1, boolean ryContain) {
+        if(ryContain){
+            //创建日报设备
+            List <IotOpeationFillDO> devList = opeationFillService.reportMethod(orderList1);
+            //插入日报设备
+            iotOpeationFillMapper.insertFill(devList);
+        }
+    }
 
+    private void rhReportInsert(IotOperationPlanDO plan, List<IotOpeationFillOrderDO> orderList1, boolean rhContain) {
+        if(rhContain){
+
+            //创建日报设备
+            List <IotOpeationFillDO> devList = opeationFillService.reportMethod(orderList1);
+            //插入日报设备
+            iotOpeationFillMapper.insertFill(devList);
+
+            //2、瑞恒无指定队伍全部队伍插入日报设备
+            //筛选正常工单部门id
+            List<Long> deptIdList = orderList1.stream().map(IotOpeationFillOrderDO::getDeptId).collect(Collectors.toList());
+            //查询瑞恒所有责任人数据
+            Set<Long> pIdList = new HashSet<>();
+            pIdList =  deptService.getChildDeptIdListFromCache(plan.getDeptId());
+            pIdList.add(plan.getDeptId());
+            List<IotOpeationFillDO> rhPdList = iotOpeationFillMapper.pdListRh(pIdList);
+            //筛选与正常工单不同部门的责任人数据
+            List<IotOpeationFillDO> verRPList = rhPdList.stream().filter(e->!deptIdList.contains(e.getDeptId())).collect(Collectors.toList());
+            //筛选小队责任人数据
+            // 使用迭代器遍历集合
+            Iterator<IotOpeationFillDO> iterator = verRPList.iterator();
+            while (iterator.hasNext()) {
+                IotOpeationFillDO rp = iterator.next();
+                IotOpeationFillOrderDO rpOrder = new IotOpeationFillOrderDO();
+                rpOrder.setDeptId(rp.getDeptId());
+                List<IotOpeationFillOrderDO> childList = iotOpeationFillMapper.childList(rpOrder);
+
+                // 当childList有元素时,通过迭代器删除当前元素
+                if (childList.size() > 0) {
+                    iterator.remove(); // 使用迭代器的remove方法安全删除
+                }
+            }
+            //创建虚拟工单
+            if(verRPList.size()>0){
+                for (IotOpeationFillDO vir:verRPList) {
+                    IotRhDailyReportSaveReqVO saveReqVO = new IotRhDailyReportSaveReqVO();
+                    //查询队伍增压机状态
+                    IotDeviceDO virDev = new IotDeviceDO();
+                    virDev.setDeptId(vir.getDeptId());
+                    IotDeviceDO devStatus = iotOpeationFillMapper.devStatus(virDev);
+                    //不为空则为日报赋值
+                    if(devStatus!=null){
+                        saveReqVO.setConstructionStatus(devStatus.getDeviceStatus());
+                    }
+                    //当日注气量
+                    saveReqVO.setDailyGasInjection(BigDecimal.valueOf(0.00));
+                    //当日注水量
+                    saveReqVO.setDailyWaterInjection(BigDecimal.valueOf(0.00));
+                    //当日注气时间
+                    saveReqVO.setDailyInjectGasTime(BigDecimal.valueOf(0.00));
+                    //当日注水时间
+                    saveReqVO.setDailyInjectWaterTime(BigDecimal.valueOf(0.00));
+                    //当日用电量
+                    saveReqVO.setDailyPowerUsage(BigDecimal.valueOf(0.00));
+                    //非生产时间
+                    saveReqVO.setNonProductionTime(BigDecimal.valueOf(0.00));
+                    saveReqVO.setDeptId(vir.getDeptId());
+                    saveReqVO.setFillOrderCreateTime(LocalDateTime.now());
+                    iotRhDailyReportService.createIotRhDailyReport(saveReqVO);
+                }
+            }
+        }
     }
 
 }

+ 3 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/job/MapLngLatJob.java

@@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
 import cn.iocoder.yudao.framework.tenant.core.job.TenantJob;
 import cn.iocoder.yudao.module.pms.ThingsModelDTO;
 import cn.iocoder.yudao.module.pms.controller.admin.TableDataInfo;
+import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDevicePageReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;
 import cn.iocoder.yudao.module.pms.dal.mysql.IotDeviceMapper;
 import com.alibaba.fastjson.JSON;
@@ -34,7 +35,8 @@ public class MapLngLatJob implements JobHandler {
     @TenantIgnore
     @DataPermission(enable = false)
     public String execute(String param) throws Exception {
-        List<IotDeviceDO> iotDeviceDOS = iotDeviceMapper.selectDataCollect();
+        IotDevicePageReqVO page = new IotDevicePageReqVO();
+        List<IotDeviceDO> iotDeviceDOS = iotDeviceMapper.selectDataCollect(page);
         iotDeviceDOS.forEach(deviceDO -> {
             if (Objects.nonNull(deviceDO.getYfDeviceId())) {
                 TableDataInfo tableDataInfo = restTemplate.getForObject(yanfanUrl + "/prod-api/iot/device/listThingsModel?deviceId="+deviceDO.getYfDeviceId()+"&pageNum=1&pageSize=200", TableDataInfo.class);

+ 9 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/message/PmsMessage.java

@@ -77,6 +77,9 @@ public class PmsMessage {
             if (PmsConstants.GENERATE_OPERATION.equals(businessType)) {
                 msg = "您有新的运行记录工单 " + name + ",请处理。"+"["+ DateUtil.format(new Date(),"yyyy-MM-dd hh:mm:ss")+"]";
             }
+            if (PmsConstants.FAILURE_NO_PASS.equals(businessType)) {
+                msg = name+"故障上报流程审批完成,没有生成维修工单,将设备的状态调整为观察使用。";
+            }
             String url = "";
 
             if(PmsConstants.GENERATE_OPERATION.equals(businessType)){
@@ -91,7 +94,12 @@ public class PmsMessage {
                 url=systemUrl + "dingding?id="+businessId+"&type="+businessType+"&userId="+userId;
             }
 
-            dingtalkSendApi.send(mobile, msg,"link", url);
+            if (PmsConstants.FAILURE_NO_PASS.equals(businessType)) {
+                //通知设备状态变更为观察使用
+                dingtalkSendApi.send(mobile, msg, "text",url);
+            } else {
+                dingtalkSendApi.send(mobile, msg,"link", url);
+            }
         }
     }
 }

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

@@ -24,7 +24,7 @@ import java.util.Map;
 public interface IotDeviceService {
     void templateChange(String categoryId, List<IotDeviceProperty> properties);
     void importDevice(List<DeviceImportExcelVO> list);
-    List<IotDeviceDO> getMapDevice();
+    List<IotDeviceDO> getMapDevice(IotDevicePageReqVO pageReqVO);
     List<ThingsModelDTO> getTdParams(IotDeviceDO iotDeviceDO);
     /**
      * 创建设备台账

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

@@ -43,6 +43,8 @@ import cn.iocoder.yudao.module.pms.service.iotdevicerunlog.IotDeviceRunLogServic
 import cn.iocoder.yudao.module.pms.service.iotmodeltemplateattrs.IotModelTemplateAttrsService;
 import cn.iocoder.yudao.module.pms.service.yanfan.ThingsModelService;
 import cn.iocoder.yudao.module.pms.service.yanfan.YfDeviceService;
+import cn.iocoder.yudao.module.system.api.dept.DeptApi;
+import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
 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.dict.DictDataDO;
@@ -127,6 +129,8 @@ public class IotDeviceServiceImpl implements IotDeviceService {
     @Autowired
     private IotOpeationFillMapper zhbdmapper;
     private final static String parameter = "lng~~经度,lat~~纬度,today_distance~~当日里程,distance~~总里程,todayoil~~当日油量,totaloil~~总油量,online~~是否在线,oil1~~1路油量,oil2~~2路油量,oil3~~3路油量,oil4~~4路油量,vehicle_name~~车牌号码";
+    @Autowired
+    private DeptApi deptApi;
 
     @Override
     public void templateChange(String categoryId, List<IotDeviceProperty> properties) {
@@ -167,8 +171,15 @@ public class IotDeviceServiceImpl implements IotDeviceService {
     }
 
     @Override
-    public List<IotDeviceDO> getMapDevice() {
-        return iotDeviceMapper.selectDataCollect();
+    public List<IotDeviceDO> getMapDevice(IotDevicePageReqVO reqVO) {
+        Long deptId = reqVO.getDeptId();
+        if (Objects.nonNull(deptId)) {
+            List<Long> collect = deptApi.getChildDeptList(deptId).stream().map(DeptRespDTO::getId).collect(Collectors.toList());
+            collect.add(deptId);
+            reqVO.setDeptId(null);
+            reqVO.setDeptIds(collect);
+        }
+        return iotDeviceMapper.selectDataCollect(reqVO);
     }
 
     public void init() {

+ 56 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/alarm/IotAlarmSettingService.java

@@ -0,0 +1,56 @@
+package cn.iocoder.yudao.module.pms.service.alarm;
+
+import java.util.*;
+import javax.validation.*;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.module.pms.controller.admin.alarm.vo.IotAlarmSettingPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.alarm.vo.IotAlarmSettingSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.alarm.IotAlarmSettingDO;
+
+/**
+ * 告警设置 Service 接口
+ *
+ * @author 超级管理员
+ */
+public interface IotAlarmSettingService {
+
+    /**
+     * 创建告警设置
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createIotAlarmSetting(@Valid IotAlarmSettingSaveReqVO createReqVO);
+
+    /**
+     * 更新告警设置
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateIotAlarmSetting(@Valid IotAlarmSettingSaveReqVO updateReqVO);
+
+    /**
+     * 删除告警设置
+     *
+     * @param id 编号
+     */
+    void deleteIotAlarmSetting(Long id);
+
+    /**
+     * 获得告警设置
+     *
+     * @param id 编号
+     * @return 告警设置
+     */
+    IotAlarmSettingDO getIotAlarmSetting(Long id);
+
+    /**
+     * 获得告警设置分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 告警设置分页
+     */
+    PageResult<IotAlarmSettingDO> getIotAlarmSettingPage(IotAlarmSettingPageReqVO pageReqVO);
+
+}

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

@@ -0,0 +1,76 @@
+package cn.iocoder.yudao.module.pms.service.alarm;
+
+import cn.iocoder.yudao.framework.common.exception.ErrorCode;
+import cn.iocoder.yudao.module.pms.controller.admin.alarm.vo.IotAlarmSettingPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.alarm.vo.IotAlarmSettingSaveReqVO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.alarm.IotAlarmSettingDO;
+import cn.iocoder.yudao.module.pms.dal.mysql.alarm.IotAlarmSettingMapper;
+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.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;
+
+/**
+ * 告警设置 Service 实现类
+ *
+ * @author 超级管理员
+ */
+@Service
+@Validated
+public class IotAlarmSettingServiceImpl implements IotAlarmSettingService {
+
+    @Resource
+    private IotAlarmSettingMapper iotAlarmSettingMapper;
+
+    @Override
+    public Long createIotAlarmSetting(IotAlarmSettingSaveReqVO createReqVO) {
+        // 插入
+        IotAlarmSettingDO iotAlarmSetting = BeanUtils.toBean(createReqVO, IotAlarmSettingDO.class);
+        iotAlarmSetting.setDeleted(false);
+        iotAlarmSettingMapper.insert(iotAlarmSetting);
+        // 返回
+        return iotAlarmSetting.getId();
+    }
+
+    @Override
+    public void updateIotAlarmSetting(IotAlarmSettingSaveReqVO updateReqVO) {
+        // 校验存在
+        validateIotAlarmSettingExists(updateReqVO.getId());
+        // 更新
+        IotAlarmSettingDO updateObj = BeanUtils.toBean(updateReqVO, IotAlarmSettingDO.class);
+        iotAlarmSettingMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteIotAlarmSetting(Long id) {
+        // 校验存在
+        validateIotAlarmSettingExists(id);
+        // 删除
+        iotAlarmSettingMapper.deleteById(id);
+    }
+
+    private void validateIotAlarmSettingExists(Long id) {
+        if (iotAlarmSettingMapper.selectById(id) == null) {
+            throw exception(new ErrorCode(999,"不存在告警设置信息"));
+        }
+    }
+
+    @Override
+    public IotAlarmSettingDO getIotAlarmSetting(Long id) {
+        return iotAlarmSettingMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<IotAlarmSettingDO> getIotAlarmSettingPage(IotAlarmSettingPageReqVO pageReqVO) {
+        return iotAlarmSettingMapper.selectPage(pageReqVO);
+    }
+
+}

+ 78 - 38
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/failure/IotFailureReportServiceImpl.java

@@ -13,14 +13,18 @@ import cn.iocoder.yudao.module.pms.constant.PmsConstants;
 import cn.iocoder.yudao.module.pms.controller.admin.failure.vo.IotFailureReportPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.failure.vo.IotFailureReportProcessVO;
 import cn.iocoder.yudao.module.pms.controller.admin.failure.vo.IotFailureReportSaveReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotdeviceperson.vo.IotDevicePersonPageReqVO;
+import cn.iocoder.yudao.module.pms.controller.admin.iotdeviceperson.vo.IotDevicePersonRelationSaveReqVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.failure.IotFailureReportDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotdeviceperson.IotDevicePersonDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.maintain.IotMaintainDO;
 import cn.iocoder.yudao.module.pms.dal.mysql.IotDeviceMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.failure.IotFailureReportMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.maintain.IotMaintainMapper;
 import cn.iocoder.yudao.module.pms.enums.common.FailureAuditStatusEnum;
 import cn.iocoder.yudao.module.pms.message.PmsMessage;
+import cn.iocoder.yudao.module.pms.service.iotdeviceperson.IotDevicePersonService;
 import cn.iocoder.yudao.module.system.api.dept.DeptApi;
 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
 import cn.iocoder.yudao.module.system.api.dingtalk.DingtalkSendApi;
@@ -79,53 +83,79 @@ public class IotFailureReportServiceImpl implements IotFailureReportService {
     private RoleApi roleApi;
     @Autowired
     private PmsMessage pmsMessage;
+    @Autowired
+    private IotDevicePersonService iotDevicePersonService;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void approvalFailureReport(Long id, Integer bpmResult) {
-        if(bpmResult ==2 ){
-            //更新故障上报状态及审核状态
-            IotFailureReportDO failureReportDO = iotFailureReportMapper.selectById(id);
-            failureReportDO.setStatus("trans");//转工单
-            failureReportDO.setAuditStatus(FailureAuditStatusEnum.APPROVE.getStatus());
-            iotFailureReportMapper.insertOrUpdate(failureReportDO);
-            //生成工单
-            IotMaintainDO iotMaintainDO = new IotMaintainDO();
-            BeanUtils.copyProperties(failureReportDO, iotMaintainDO);
-            iotMaintainDO.setStatus("tx");
-            iotMaintainDO.setPic(null);
-            //iotMaintainDO.setAuditStatus(0);
-            iotMaintainDO.setAuditStatus(null);
-            iotMaintainDO.setMaintainType("故障上报");
-            iotMaintainDO.setMaintainPerson(Objects.isNull(failureReportDO.getAssigneeUserId())? Long.valueOf(failureReportDO.getCreator()) :failureReportDO.getAssigneeUserId());
-            AdminUserRespDTO apiUser = adminUserApi.getUser(iotMaintainDO.getMaintainPerson());
-            if (Objects.isNull(apiUser)) {
-                throw new ServiceException(new ErrorCode(11,"责任人不存在"));
-            }
-            iotMaintainDO.setMaintainPersonName(apiUser.getNickname());
-            iotMaintainDO.setFailureId(failureReportDO.getId());
-            iotMaintainDO.setId(null);
-            iotMaintainDO.setOutFile("[]");
-            iotMaintainMapper.insert(iotMaintainDO);
-            //发送消息
-            Map<String, Object> templateParams = new HashMap<>();
-            templateParams.put("name", iotMaintainDO.getDeviceName());
-            templateParams.put("businessType", PmsConstants.GENERATE_MAINTAIN);
-            templateParams.put("businessId", iotMaintainDO.getId());
-            AdminUserRespDTO user = adminUserApi.getUser(Objects.isNull(failureReportDO.getAssigneeUserId()) ? Long.valueOf(failureReportDO.getCreator()) : failureReportDO.getAssigneeUserId());
+        IotFailureReportDO failureReportDO = iotFailureReportMapper.selectById(id);
+        if (Objects.nonNull(failureReportDO.getAssigneeUserId())) {
+            if(bpmResult ==2 ){
+                //更新故障上报状态及审核状态
+                failureReportDO.setStatus("trans");//转工单
+                failureReportDO.setAuditStatus(FailureAuditStatusEnum.APPROVE.getStatus());
+                iotFailureReportMapper.insertOrUpdate(failureReportDO);
+                //生成工单
+                IotMaintainDO iotMaintainDO = new IotMaintainDO();
+                BeanUtils.copyProperties(failureReportDO, iotMaintainDO);
+                iotMaintainDO.setStatus("tx");
+                iotMaintainDO.setPic(null);
+                //iotMaintainDO.setAuditStatus(0);
+                iotMaintainDO.setAuditStatus(null);
+                iotMaintainDO.setMaintainType("故障上报");
+                iotMaintainDO.setMaintainPerson(Objects.isNull(failureReportDO.getAssigneeUserId())? Long.valueOf(failureReportDO.getCreator()) :failureReportDO.getAssigneeUserId());
+                AdminUserRespDTO apiUser = adminUserApi.getUser(iotMaintainDO.getMaintainPerson());
+                if (Objects.isNull(apiUser)) {
+                    throw new ServiceException(new ErrorCode(11,"责任人不存在"));
+                }
+                iotMaintainDO.setMaintainPersonName(apiUser.getNickname());
+                iotMaintainDO.setFailureId(failureReportDO.getId());
+                iotMaintainDO.setId(null);
+                iotMaintainDO.setOutFile("[]");
+                iotMaintainMapper.insert(iotMaintainDO);
+                //发送消息
+                Map<String, Object> templateParams = new HashMap<>();
+                templateParams.put("name", iotMaintainDO.getDeviceName());
+                templateParams.put("businessType", PmsConstants.GENERATE_MAINTAIN);
+                templateParams.put("businessId", iotMaintainDO.getId());
+                AdminUserRespDTO user = adminUserApi.getUser(Objects.isNull(failureReportDO.getAssigneeUserId()) ? Long.valueOf(failureReportDO.getCreator()) : failureReportDO.getAssigneeUserId());
 //            notifyMessageSendApi.sendSingleMessageToAdmin(new NotifySendSingleToUserReqDTO()
 //                    .setUserId(failureReportDO.getAssigneeUserId()).setTemplateCode(PmsConstants.GENERATE_MAINTAIN).setTemplateParams(templateParams));
-            if (Objects.nonNull(user)) {
-                pmsMessage.sendMessage(iotMaintainDO.getId(), iotMaintainDO.getDeviceName(), PmsConstants.GENERATE_MAINTAIN, failureReportDO.getAssigneeUserId(), user.getMobile());
+                if (Objects.nonNull(user)) {
+                    if (Objects.nonNull(failureReportDO.getAssigneeUserId())) {
+                        pmsMessage.sendMessage(iotMaintainDO.getId(), iotMaintainDO.getDeviceName(), PmsConstants.GENERATE_MAINTAIN, failureReportDO.getAssigneeUserId(), user.getMobile());
+                    }
+                }
+            } else if (bpmResult ==3 ) {
+                //更新故障上报状态及审核状态
+                failureReportDO.setStatus("close");//关闭
+                failureReportDO.setAuditStatus(FailureAuditStatusEnum.REJECT.getStatus());
+                iotFailureReportMapper.insertOrUpdate(failureReportDO);
             }
-        } else if (bpmResult ==3 ) {
-            //更新故障上报状态及审核状态
-            IotFailureReportDO failureReportDO = iotFailureReportMapper.selectById(id);
+        } else {
+            //最终节点为否的情况下
+            //首先更新故障上报的状态
             failureReportDO.setStatus("close");//关闭
-            failureReportDO.setAuditStatus(FailureAuditStatusEnum.REJECT.getStatus());
+            failureReportDO.setAuditStatus(FailureAuditStatusEnum.APPROVE.getStatus());
             iotFailureReportMapper.insertOrUpdate(failureReportDO);
+            //更新设备状态为观察使用
+            Long deviceId = failureReportDO.getDeviceId();
+            IotDevicePersonRelationSaveReqVO statusVo = new IotDevicePersonRelationSaveReqVO();
+            statusVo.setDeviceId(deviceId);
+            statusVo.setStatus("gcsy");
+            statusVo.setReason("没有生成维修工单,设备状态调整为观察使用");
+            iotDevicePersonService.saveDeviceStatuses(ImmutableList.of(statusVo));
+            IotDevicePersonPageReqVO pageReqVO = new IotDevicePersonPageReqVO();
+            pageReqVO.setDeviceIds(ImmutableList.of(deviceId));
+            List<IotDevicePersonDO> persons = iotDevicePersonService.getPersonsByDeviceIds(pageReqVO);
+            persons.forEach(e ->{
+                AdminUserRespDTO userApiUser = adminUserApi.getUser(e.getPersonId());
+                if (Objects.nonNull(userApiUser)) {
+                    pmsMessage.sendMessage(failureReportDO.getId(), failureReportDO.getDeviceCode()+failureReportDO.getDeviceName(), PmsConstants.FAILURE_NO_PASS, e.getPersonId(), userApiUser.getMobile());
+                }
+            });
         }
-
     }
 
 
@@ -142,8 +172,10 @@ public class IotFailureReportServiceImpl implements IotFailureReportService {
             approvalIds.add(Long.parseLong(s));
         }
         assigness.put("failure_approval", approvalIds);
+        Map<String, Object> variable = new HashMap<>();
+        variable.put("continue", "0");
         String processInstanceId = processInstanceApi.createProcessInstance(SecurityFrameworkUtils.getLoginUserId(),
-                new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(PROCESS_KEY).setBusinessKey(String.valueOf(id)).setStartUserSelectAssignees(assigness));
+                new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(PROCESS_KEY).setBusinessKey(String.valueOf(id)).setStartUserSelectAssignees(assigness).setVariables(variable));
         // 将流程实例id 更新到 供应商主数据表
         iotFailureReportMapper.updateById(new IotFailureReportDO().setId(id).setProcessInstanceId(processInstanceId).setAuditStatus(FailureAuditStatusEnum.PROCESS.getStatus()));
         return processInstanceId;
@@ -211,6 +243,12 @@ public class IotFailureReportServiceImpl implements IotFailureReportService {
         reportDO.setAssigneeUserId(processVO.getAssigneeUserId());
         reportDO.setType(processVO.getType());
         iotFailureReportMapper.insertOrUpdate(reportDO);
+        //修改设备状态为待维修
+        IotDevicePersonRelationSaveReqVO statusVo = new IotDevicePersonRelationSaveReqVO();
+        statusVo.setDeviceId(reportDO.getDeviceId());
+        statusVo.setStatus("dwx");
+        statusVo.setReason("生成维修工单,设备状态为待维修");
+        iotDevicePersonService.saveDeviceStatuses(ImmutableList.of(statusVo));
         //sendMessage(reportDO);
         return reportDO.getId();
     }
@@ -253,6 +291,8 @@ public class IotFailureReportServiceImpl implements IotFailureReportService {
 
         List<Long> deptIds = deptApi.getChildDeptList(dept.getParentId()).stream().map(DeptRespDTO::getId).collect(Collectors.toList());
         deptIds.add(dept.getParentId());
+//        List<Long> deptIds = new ArrayList<>();
+//        deptIds.add(dept.getParentId());
         List<AdminUserRespDTO> userListByDeptId = adminUserApi.getUserListByDeptIdsNew(deptIds);
         return userListByDeptId;
     }

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

@@ -28,8 +28,11 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ThreadLocalRandom;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -53,7 +56,9 @@ public class IotOpeationFillServiceImpl implements IotOpeationFillService {
 
     private static Long RH_CLASS_ID = 226L;
 
-    private static Long RY_CLASS_ID = 227L;
+    private static Long RY_ZJ_CLASS_ID = 227L;
+
+    private static Long RY_XJ_CLASS_ID = 228L;
 
     @Override
     public Long createIotOpeationFill(IotOpeationFillSaveReqVO createReqVO) {
@@ -339,9 +344,15 @@ public class IotOpeationFillServiceImpl implements IotOpeationFillService {
         if(orderList.size()>0){
             //遍历工单主数据,根据dept_id查询是否为根节点
             for (IotOpeationFillOrderDO orderDO:orderList) {
+
+                IotDeviceRunLogDO runLogDO = new IotDeviceRunLogDO();
+                runLogDO.setDeptId(orderDO.getDeptId());
+                //获取队伍类型
+                IotDeviceRunLogDO teamType = iotOpeationFillMapper.getTeamType(runLogDO);
+
                 List<IotOpeationFillOrderDO> childList = iotOpeationFillMapper.childList(orderDO);
 
-                int randomNum = ThreadLocalRandom.current().nextInt(100000, 1000000);
+                int randomNum = generateUniqueNumber();
 
                 //如果是根节点,则证明该部门为小队并且属于瑞恒,创建对应日报虚拟设备
                 if(childList.size()==0){
@@ -351,8 +362,13 @@ public class IotOpeationFillServiceImpl implements IotOpeationFillService {
 
                     if(rhIdList.contains(orderDO.getDeptId())){
                         devOrder.setDeviceCategoryId(RH_CLASS_ID);
-                    }else if(ryIdList.contains(orderDO.getDeptId())){
-                        devOrder.setDeviceCategoryId(RY_CLASS_ID);
+                    }else if(ryIdList.contains(orderDO.getDeptId())&&teamType!=null){
+                        //队伍类型为zj则日报设备分类为钻井,否则为修井
+                        if(teamType.getPointCode().equals("zj")){
+                            devOrder.setDeviceCategoryId(RY_ZJ_CLASS_ID);
+                        }else{
+                            devOrder.setDeviceCategoryId(RY_XJ_CLASS_ID);
+                        }
                     }
 
                     devOrder.setDeptId(orderDO.getDeptId());
@@ -368,6 +384,33 @@ public class IotOpeationFillServiceImpl implements IotOpeationFillService {
         return devList;
     }
 
+    // 用于记录每天的序列号,确保当天内不重复
+    private static final ConcurrentHashMap<String, AtomicInteger> dailySequence = new ConcurrentHashMap<>();
+    // 日期格式化器,用于生成每天的唯一标识
+    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd");
+    public static synchronized int generateUniqueNumber() {
+        // 获取当前日期字符串,如20231005
+        String today = LocalDate.now().format(DATE_FORMATTER);
+        // 提取年份后两位和月份日期的哈希值作为日期标识(2位)
+        int dateCode = (Integer.parseInt(today.substring(2, 4)) +
+                Integer.parseInt(today.substring(4, 6)) +
+                Integer.parseInt(today.substring(6, 8))) % 99 + 1;
+
+        // 获取当天的序列号生成器,不存在则创建
+        AtomicInteger sequence = dailySequence.computeIfAbsent(today, k -> new AtomicInteger(1));
+        // 获取下一个序列号
+        int seq = sequence.getAndIncrement();
+
+        // 检查是否超过每天的最大生成量
+        if (seq > 9999) {
+            throw new RuntimeException("今日已超过最大生成数量(9999个)");
+        }
+
+        // 组合日期标识和序列号,生成6位唯一数字
+        return dateCode * 10000 + seq;
+    }
+
+
     @Override
     public IotOpeationFillDO isReport(IotOpeationFillDO fillDO) {
         return iotOpeationFillMapper.isReport(fillDO);

+ 1 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/maintain/IotMaintainServiceImpl.java

@@ -278,6 +278,7 @@ public class IotMaintainServiceImpl implements IotMaintainService {
                 maintainMaterial.getMaterials().forEach(e ->{
                     IotMaintainMaterialsDO iotMaintainMaterialsDO = new IotMaintainMaterialsDO();
                     BeanUtils.copyProperties(e, iotMaintainMaterialsDO);
+                    iotMaintainMaterialsDO.setId(null);
                     iotMaintainMaterialsDO.setDeleted(false);
                     iotMaintainMaterialsDO.setMaintainId(updateObj.getId());
                     iotMaintainMaterialsDO.setBomId(iotMaintainBomDO.getId());

+ 2 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotDeviceRunLogMapper.xml

@@ -57,6 +57,7 @@
         FROM rq_iot_device_run_log a
         WHERE a.create_time BETWEEN #{createTime[0],typeHandler=org.apache.ibatis.type.LocalDateTimeTypeHandler} AND #{createTime[1],typeHandler=org.apache.ibatis.type.LocalDateTimeTypeHandler}
           and a.point_name = #{pointName}
+          and (a.device_code is null or a.device_code='')
         <if test="deptIds != null and deptIds.size &gt; 0">
             AND a.dept_id IN
             <foreach collection="deptIds" index="index" item="key" open="(" separator="," close=")">
@@ -75,6 +76,7 @@
         WHERE
             a.create_time >= DATE_SUB(NOW(), INTERVAL 1 YEAR)
           AND a.fill_content IS NOT NULL
+          and (a.device_code is null or a.device_code ='')
           and a.point_name = #{pointName}
         <if test="deptIds != null and deptIds.size &gt; 0">
             AND a.dept_id IN

+ 10 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotMainWorkOrderMapper.xml

@@ -44,6 +44,16 @@
         <if test="reqVO.result != null">
             AND mwo.result = #{reqVO.result}
         </if>
+        <if test="reqVO.createTime != null and reqVO.createTime.length > 0">
+            <!-- 处理“开始时间”(数组第1位,如 createTime[0] = 2024-01-01 00:00:00) -->
+            <if test="reqVO.createTime[0] != null">
+                AND mwo.create_time &gt;= #{reqVO.createTime[0]}
+            </if>
+            <!-- 处理“结束时间”(数组第2位,如 createTime[1] = 2024-01-31 23:59:59) -->
+            <if test="reqVO.createTime.length > 1 and reqVO.createTime[1] != null">
+                AND mwo.create_time &lt;= #{reqVO.createTime[1]}
+            </if>
+        </if>
         ORDER BY
         <if test="alarmWorkOrderIds != null and alarmWorkOrderIds.size &gt; 0">
             CASE WHEN mwo.id IN

+ 216 - 195
yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotOpeationFillMapper.xml

@@ -7,32 +7,32 @@
             resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO">
 
         select
-            distinct
-            c.id,
-            c.dept_id,
-            c.device_code,
-            c.device_name,
-            b.device_category_id,
-            d.person_id user_id
+        distinct
+        c.id,
+        c.dept_id,
+        c.device_code,
+        c.device_name,
+        b.device_category_id,
+        d.person_id user_id
         from
-            rq_iot_model_template a,
-            rq_iot_model_template_attrs b,
-            rq_iot_device c,
-            rq_iot_device_person d
+        rq_iot_model_template a,
+        rq_iot_model_template_attrs b,
+        rq_iot_device c,
+        rq_iot_device_person d
         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')
-          and
-            a.deleted = 0
-          and
-            c.deleted = 0
-          and
-            d.deleted = 0
+        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')
+        and
+        a.deleted = 0
+        and
+        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=")">
@@ -50,25 +50,25 @@
     <select id="getFillDevices1"
             resultType="cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO">
         select
-            distinct
-            c.id,
-            c.dept_id,
-            c.device_code,
-            c.device_name,
-            b.device_category_id,
-            d.person_id user_id,
-            e.name dept_name,
-            f.nickname,
-            g.name,
-            c.device_status
+        distinct
+        c.id,
+        c.dept_id,
+        c.device_code,
+        c.device_name,
+        b.device_category_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,
-            system_dept e,
-            system_users f,
-            rq_iot_product_classify g
+        rq_iot_model_template a,
+        rq_iot_model_template_attrs b,
+        rq_iot_device c,
+        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
@@ -154,31 +154,31 @@
 
 
     <insert id="insertFill"
-    parameterType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO">
-       insert into rq_iot_opeation_fill(device_id,device_code,device_name,device_category_id,create_time,dept_id,order_id,is_report)
-           values
+            parameterType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO">
+        insert into rq_iot_opeation_fill(device_id,device_code,device_name,device_category_id,create_time,dept_id,order_id,is_report)
+        values
         <foreach collection="list" item="item" separator=",">
             (#{item.deviceId},#{item.deviceCode},#{item.deviceName},
             #{item.deviceCategoryId},#{item.createTime},#{item.deptId},#{item.orderId},#{item.isReport})
         </foreach>
     </insert>
 
-   <!-- <insert id="insertFillOrder"
-            parameterType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO">
-        insert into rq_iot_opeation_fill_order(dept_id,order_name,
-        order_status,create_time,order_type,user_name,user_id)
-        values
-        <foreach collection="list" item="item" separator=",">
-            (#{item.deptId},#{item.orderName},#{item.orderStatus},
-            #{item.createTime},#{item.orderType},#{item.userName},#{item.userId})
-        </foreach>
+    <!-- <insert id="insertFillOrder"
+             parameterType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO">
+         insert into rq_iot_opeation_fill_order(dept_id,order_name,
+         order_status,create_time,order_type,user_name,user_id)
+         values
+         <foreach collection="list" item="item" separator=",">
+             (#{item.deptId},#{item.orderName},#{item.orderStatus},
+             #{item.createTime},#{item.orderType},#{item.userName},#{item.userId})
+         </foreach>
 
-    </insert>-->
+     </insert>-->
 
     <insert id="insertLog"
             parameterType="cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicerunlog.IotDeviceRunLogDO">
         insert into rq_iot_device_run_log
-            (dept_id,device_id,device_code,point_code,fill_content,create_time,point_name,total_run_time,is_sum)
+        (dept_id,device_id,device_code,point_code,fill_content,create_time,point_name,total_run_time,is_sum)
         values
         <foreach collection="list" item="item" separator=",">
             (#{item.deptId},#{item.deviceId},#{item.deviceCode},
@@ -192,22 +192,22 @@
         insert into rq_iot_device_run_log
         (dept_id, device_id, device_code, point_code, fill_content, create_time, point_name, total_run_time,is_sum)
         values
-        (#{deptId}, #{deviceId}, #{deviceCode},
-         #{pointCode}, #{fillContent}, #{createTime}, #{pointName}, #{totalRunTime},#{isSum})
+            (#{deptId}, #{deviceId}, #{deviceCode},
+             #{pointCode}, #{fillContent}, #{createTime}, #{pointName}, #{totalRunTime},#{isSum})
     </insert>
 
     <update id="updateLog" parameterType="cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicerunlog.IotDeviceRunLogDO">
         update rq_iot_device_run_log
         set
-        fill_content = #{fillContent}
+            fill_content = #{fillContent}
         where
-            device_code = #{deviceCode}
-        and
+            device_id = #{deviceId}
+          and
             point_name = #{pointName}
-        and
+          and
             DATE(create_time) = #{createTime}
-        and
-           is_sum = 0
+          and
+            is_sum = 0
     </update>
 
     <update id="updateSumLog" parameterType="cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicerunlog.IotDeviceRunLogDO">
@@ -215,7 +215,7 @@
         set
             total_run_time = #{totalRunTime}
         where
-            device_code = #{deviceCode}
+            device_id = #{deviceId}
           and
             point_name = #{pointName}
           and
@@ -224,20 +224,20 @@
             is_sum = 1
     </update>
 
-   <!-- <select id="fillList" parameterType="cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillRespVO"
-    resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO">
-        SELECT * FROM
-            rq_iot_opeation_fill
-        WHERE DATE(create_time) = CURDATE()
-        <if test="deptId != null  and deptId != ''">
-        and dept_id in (SELECT d1.id
-            FROM system_dept d1
-            JOIN system_dept d2 ON d2.id = d1.parent_id
-            WHERE d2.parent_id = #{deptId}
-            union
-            select id from system_dept where id = #{deptId})
-        </if>
-    </select>-->
+    <!-- <select id="fillList" parameterType="cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillRespVO"
+     resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO">
+         SELECT * FROM
+             rq_iot_opeation_fill
+         WHERE DATE(create_time) = CURDATE()
+         <if test="deptId != null  and deptId != ''">
+         and dept_id in (SELECT d1.id
+             FROM system_dept d1
+             JOIN system_dept d2 ON d2.id = d1.parent_id
+             WHERE d2.parent_id = #{deptId}
+             union
+             select id from system_dept where id = #{deptId})
+         </if>
+     </select>-->
     <select id="fillList" parameterType="cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillRespVO"
             resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO">
         SELECT * FROM
@@ -276,9 +276,9 @@
     <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}
+            reason = #{reason}
         where
-        id = #{id}
+            id = #{id}
     </update>
 
 
@@ -321,7 +321,7 @@
         AND -->(
         1=1
         <if test="orderId != null and orderId != ''">
-           and  a.order_id = #{orderId}
+            and  a.order_id = #{orderId}
         </if>
         <!--<if test="orgName != null and orgName != ''">
             (
@@ -343,18 +343,18 @@
     <select id="getOrderIds" parameterType="cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillRespVO"
             resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO">
         select
-            distinct a.order_id
+        distinct a.order_id
         from
         rq_iot_opeation_fill a,
         rq_iot_opeation_fill_order b
         where
-            a.order_id = b.id
+        a.order_id = b.id
         and
-            a.deleted = 0
+        a.deleted = 0
         and
-            b.deleted = 0
+        b.deleted = 0
         and
-            a.order_id is not null
+        a.order_id is not null
         and(
         <if test="orgName != null and orgName != ''">
             (
@@ -402,7 +402,7 @@
             rq_iot_opeation_fill
         WHERE
             order_id = #{orderId}
-        and
+          and
             dept_id IN (
                 SELECT id FROM (
                                    SELECT d1.id FROM system_dept d1 WHERE d1.id = #{deptId}
@@ -414,7 +414,7 @@
                                    SELECT d4.id FROM system_dept d1 JOIN system_dept d2 ON d2.parent_id = d1.id JOIN system_dept d3 ON d3.parent_id = d2.id JOIN system_dept d4 ON d4.parent_id = d3.id WHERE d1.id = #{deptId}
                                ) AS dept_hierarchy
             )
-        and device_name != '日报填报'
+          and device_name != '日报填报'
     </select>
 
     <!--  -->
@@ -532,22 +532,22 @@
 
     <select id="pdList" resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO">
         select
-            distinct
-            b.id user_id,
-            b.nickname user_name,
-            c.id dept_id,
-            b.mobile,
-            c.name orgName
+        distinct
+        b.id user_id,
+        b.nickname user_name,
+        c.id dept_id,
+        b.mobile,
+        c.name orgName
         from
-            rq_iot_device_person a
-                left join
-            system_users b
-            on
-                a.person_id = b.id
-                left join
-            system_dept c
-            on
-                b.dept_id = c.id
+        rq_iot_device_person a
+        left join
+        system_users b
+        on
+        a.person_id = b.id
+        left join
+        system_dept c
+        on
+        b.dept_id = c.id
         where b.id is not null
         <if test="deviceIds != null and !deviceIds.isEmpty()">
             and a.device_id  in
@@ -588,70 +588,70 @@
     <select id="allOrder" resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillOrderDO">
         select distinct user_name
         from
-            rq_iot_opeation_fill_order
+        rq_iot_opeation_fill_order
         where
-            DATE(create_time) = DATE(#{localDateTime})
-            <if test="userNames != null and !userNames.isEmpty()">
-                and user_name  in
-                <foreach collection="userNames" item="userName" open="(" separator="," close=")">
-                    #{userName}
-                </foreach>
-            </if>
+        DATE(create_time) = DATE(#{localDateTime})
+        <if test="userNames != null and !userNames.isEmpty()">
+            and user_name  in
+            <foreach collection="userNames" item="userName" open="(" separator="," close=")">
+                #{userName}
+            </foreach>
+        </if>
     </select>
 
     <select id="pdList2" resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO">
         select
-            distinct
-            b.id user_id,
-            b.nickname user_name,
-            c.id dept_id,
-            b.mobile,
-            c.name orgName
+        distinct
+        b.id user_id,
+        b.nickname user_name,
+        c.id dept_id,
+        b.mobile,
+        c.name orgName
         from
-            rq_iot_device_person a
-                left join
-            system_users b
-            on
-                a.person_id = b.id
-                left join
-            system_dept c
-            on
-                b.dept_id = c.id
+        rq_iot_device_person a
+        left join
+        system_users b
+        on
+        a.person_id = b.id
+        left join
+        system_dept c
+        on
+        b.dept_id = c.id
         where
-            b.id is not null
-          and
-            c.id is not null
+        b.id is not null
+        and
+        c.id is not null
         <if test="deviceIds != null and !deviceIds.isEmpty()">
             and c.id  in
             <foreach collection="deviceIds" item="id" open="(" separator="," close=")">
                 #{id}
             </foreach>
         </if>
-          and
-            a.person_id
-            not in
-              (select
-                   distinct
-                   d.person_id
-               from
-                   rq_iot_model_template a,
-                   rq_iot_model_template_attrs b,
-                   rq_iot_device c,
-                   rq_iot_device_person d
-               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')
-                 and
-                   a.deleted = 0
-                 and
-                   c.deleted = 0
-                 and
-                   d.deleted = 0)
+        and
+        a.person_id
+        not in
+        (select
+        distinct
+        d.person_id
+        from
+        rq_iot_model_template a,
+        rq_iot_model_template_attrs b,
+        rq_iot_device c,
+        rq_iot_device_person d
+        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')
+        and
+        a.deleted = 0
+        and
+        c.deleted = 0
+        and
+        d.deleted = 0)
     </select>
 
     <select id="fillList1" parameterType="cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillRespVO"
@@ -666,7 +666,7 @@
 
 
     <select id="getAttrsById" parameterType="cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO"
-    resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotmodeltemplateattrs.IotModelTemplateAttrsDO">
+            resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotmodeltemplateattrs.IotModelTemplateAttrsDO">
         select
             id,
             name,
@@ -685,16 +685,16 @@
 
     <update id="updateFill"  parameterType="cn.iocoder.yudao.module.pms.controller.admin.vo.IotOpeationModelPageReqVO">
         update  rq_iot_opeation_fill
-         set is_fill = '1'
+        set is_fill = '1'
         where device_id = #{deviceId}
-        and DATE(create_time) = DATE(#{createTime})
+          and DATE(create_time) = DATE(#{createTime})
     </update>
 
     <select id="getFillList" parameterType="cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillRespVO"
             resultType="cn.iocoder.yudao.module.pms.controller.admin.iotopeationfill.vo.IotOpeationFillRespVO">
         select distinct b.* from
-            rq_iot_opeation_fill b,
-            rq_iot_opeation_fill_order c
+                                rq_iot_opeation_fill b,
+                                rq_iot_opeation_fill_order c
         where
             c.id = #{orderId}
           and
@@ -708,7 +708,7 @@
 
 
     <select id="getDeivceFillInfo" parameterType="cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicerunlog.IotDeviceRunLogDO"
-    resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicerunlog.IotDeviceRunLogDO">
+            resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicerunlog.IotDeviceRunLogDO">
         <!--SELECT * FROM rq_iot_device_run_log
         WHERE
             device_id = #{deviceId}
@@ -770,17 +770,17 @@
 
 
     <select id="devList" parameterType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO"
-    resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO">
+            resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO">
         select device_id from rq_iot_opeation_fill where order_id = #{orderId}
     </select>
 
     <select id="orderList" parameterType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO"
             resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO">
         select distinct order_id
-         from
-             rq_iot_opeation_fill
+        from
+            rq_iot_opeation_fill
         where
-             device_id = #{deviceId}
+            device_id = #{deviceId}
           and DATE(create_time) = #{creDate}
           and order_id != #{orderId}
     </select>
@@ -823,14 +823,14 @@
     <select id="deviceCountList" parameterType="cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicecountdata.IotDeviceCountData"
             resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicecountdata.IotDeviceCountData">
         select
-               distinct
-               a.device_code,
-               a.device_name,
-               a.create_time,
-               b.name dept_name,
-               a.is_fill,
-               d.nickname,
-               e.order_name
+        distinct
+        a.device_code,
+        a.device_name,
+        a.create_time,
+        b.name dept_name,
+        a.is_fill,
+        d.nickname,
+        e.order_name
         FROM rq_iot_opeation_fill a
         LEFT JOIN system_dept b
         ON a.dept_id = b.id
@@ -884,7 +884,7 @@
 
 
     <select id="countList" parameterType="cn.iocoder.yudao.module.pms.dal.dataobject.iotcountdata.IotCountDataDO"
-    resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotcountdata.IotCountDataDO">
+            resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotcountdata.IotCountDataDO">
         -- 统计指定部门及其子部门的工单状态
         SELECT
         dept_id,
@@ -1040,22 +1040,31 @@
 
 
     <select id="childList" parameterType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillOrderDO"
-    resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillOrderDO">
+            resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillOrderDO">
         SELECT id dept_id
         FROM system_dept
         WHERE parent_id = #{deptId}
           AND deleted = 0
     </select>
 
+    <select id="devStatus" parameterType="cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO"
+            resultType="cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO">
+        SELECT device_status
+        FROM rq_iot_device
+        WHERE dept_id = #{deptId}
+          AND asset_class in (159,160,122,106,157,158,191)
+            LIMIT 1
+    </select>
+
     <select id="isReport" parameterType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO"
-    resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO">
+            resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO">
         select * from
             rq_iot_opeation_fill
         where
             device_id = #{deviceId}
-        and
+          and
             DATE(create_time) = DATE(#{createTime})
-        LIMIT 1
+            LIMIT 1
     </select>
 
     <select id="orderDO" parameterType="cn.iocoder.yudao.module.pms.dal.dataobject.iotopeationfill.IotOpeationFillDO"
@@ -1066,7 +1075,7 @@
             rq_iot_opeation_fill
         where
             device_id = #{deviceId}
-        and
+          and
             DATE(create_time) = #{createTime}
     </select>
 
@@ -1080,34 +1089,34 @@
             b.name AS org_name
         FROM
             rq_iot_opeation_fill a
-        INNER JOIN
+                INNER JOIN
             rq_iot_model_template_attrs b
-        ON
-            a.device_category_id = b.device_category_id
+            ON
+                a.device_category_id = b.device_category_id
         WHERE
             a.order_id = #{orderId}
-        AND (
-        -- 第一个查询的条件
+          AND (
+            -- 第一个查询的条件
             (a.is_report = 1 AND b.daily_report = 0
-            AND b.name NOT IN (
+                AND b.name NOT IN (
                     SELECT
                         DISTINCT
                         b2.name
                     FROM
                         rq_iot_opeation_fill a2
-                    INNER JOIN
+                            INNER JOIN
                         rq_iot_model_template_attrs b2
-                    ON
-                        a2.device_category_id = b2.device_category_id
+                        ON
+                            a2.device_category_id = b2.device_category_id
                     WHERE
-                       a2.order_id =  #{orderId}
-                    AND
-                       a2.is_report = 0
-                    AND
-                       b2.daily_report = 1
+                        a2.order_id =  #{orderId}
+                      AND
+                        a2.is_report = 0
+                      AND
+                        b2.daily_report = 1
                 ))
-            -- 第二个查询的条件(通过OR代替UNION)
-             OR (a.is_report is null AND b.daily_report = 1)
+                -- 第二个查询的条件(通过OR代替UNION)
+                OR (a.is_report is null AND b.daily_report = 1)
             )
           and a.device_code != ''
     </select>
@@ -1168,5 +1177,17 @@
     </select>
 
 
+    <select id="getTeamType" parameterType="cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicerunlog.IotDeviceRunLogDO"
+            resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicerunlog.IotDeviceRunLogDO">
+        select type as point_code from system_dept_type where dept_id = #{deptId}
+    </select>
+
+
+    <select id="getUserInfo" parameterType="cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicerunlog.IotDeviceRunLogDO"
+            resultType="cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO">
+        select * from system_users where dept_id = #{deptId} and nickname = '技术员'
+    </select>
+
+
 
 </mapper>

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

@@ -17,9 +17,6 @@
             status = 0
         and
             deleted = 0
-        and
-            is_report is null
-        or  is_report != 1
     </select>
 
     <select id="getReportPlan" resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationplan.IotOperationPlanDO">

+ 1 - 1
yudao-server/src/main/resources/application-dev.yaml

@@ -290,7 +290,7 @@ oa:
   cpk: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApmtQUp9M82/z22P7am5owQCknjQnjF4U4ckEh7XVtJVQZrZx7d1lCPfoYrwOKEM4DEV7khW6++4Zv5caJ/9nqPn4QFwCqJWVmCEm9vC1BA6i2yfa4bmTxdR1/oeU/Af9pDFlvv5GC9XyilO7CIKu19Ce50v7aN6h1Tjix+h5Ba8e12XAEpEZk9pFroEYfR4lrecvi1pQOwRw8YzDRC4lhGNOo5Cen1rGjk7dwzzgs4uEv9ZyPZoVJnty5P9JE/ctboEf3x4jbqIliuCRgOyXYsLlp+N282CKcWZ35URkGw2orKyG1U6L1hNoj7kkpvAo8Zagf97SdZ0nYdRBIHv6PQIDAQAB
   oaSecret: kryfoa20250905@szh
   user: OAuser
-  userid: 1234
+  userid: cLPEaFs9moW6b3xZMl1kNNWAAo7bp61ZRRTKmpiJUe56hSxQvrC2vWtY5ogj7g5FAnUOlzYjYg9MRktKXcseh/nsvZCQGa3BAlYixlDJruV19y4Omx5dYnqu/qv2rJAqTzUS71sOwuB1M2nKlLVsphw1GF74UhGP4xsjpZP7mC8=
 
 file:
   upload-path: D:\wenjian

+ 3 - 0
yudao-server/src/main/resources/application-prod.yaml

@@ -288,3 +288,6 @@ oa:
   cpk: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApmtQUp9M82/z22P7am5owQCknjQnjF4U4ckEh7XVtJVQZrZx7d1lCPfoYrwOKEM4DEV7khW6++4Zv5caJ/9nqPn4QFwCqJWVmCEm9vC1BA6i2yfa4bmTxdR1/oeU/Af9pDFlvv5GC9XyilO7CIKu19Ce50v7aN6h1Tjix+h5Ba8e12XAEpEZk9pFroEYfR4lrecvi1pQOwRw8YzDRC4lhGNOo5Cen1rGjk7dwzzgs4uEv9ZyPZoVJnty5P9JE/ctboEf3x4jbqIliuCRgOyXYsLlp+N282CKcWZ35URkGw2orKyG1U6L1hNoj7kkpvAo8Zagf97SdZ0nYdRBIHv6PQIDAQAB
   oaSecret: kryfoa20250905@szh
   user: OAuser
+  userid: cLPEaFs9moW6b3xZMl1kNNWAAo7bp61ZRRTKmpiJUe56hSxQvrC2vWtY5ogj7g5FAnUOlzYjYg9MRktKXcseh/nsvZCQGa3BAlYixlDJruV19y4Omx5dYnqu/qv2rJAqTzUS71sOwuB1M2nKlLVsphw1GF74UhGP4xsjpZP7mC8=
+file:
+  upload-path: /iotfiles

+ 1 - 1
yudao-server/src/main/resources/application-test.yaml

@@ -78,7 +78,7 @@ spring:
     host: localhost # 地址
     port: 6379 # 端口
     database: 0  # 数据库索引
-
+    password: 123456
 
 --- #################### 定时任务相关配置 ####################