From 8f7a35e3c78004de4a78d8c0ba1a1374fd63ed81 Mon Sep 17 00:00:00 2001 From: rqian <1206436827@qq.com> Date: Thu, 9 Jul 2026 08:40:32 +0800 Subject: [PATCH] update --- maibu-common/pom.xml | 11 +- .../java/com/maibu/core/business/Device.java | 19 ++- .../com/maibu/core/business/DeviceModel.java | 13 +- .../maibu/core/business/DeviceRunParam.java | 27 +++ .../business/ErrorIdentificationStandard.java | 9 +- .../com/maibu/core/business/IOTWorkOrder.java | 113 ++++++++++++- .../core/business/alarm_center/Alarm.java | 9 +- .../business/alarm_center/AlarmMessage.java | 43 +++++ .../core/business/device/NettyDevice.java | 16 +- .../core/business/dto/AlarmQueryDTO.java | 14 +- .../com/maibu/core/domain/entity/SysSite.java | 10 +- .../java/com/maibu/core/enums/ErrorLevel.java | 21 +++ .../com/maibu/core/enums/ErrorSource.java | 24 +++ .../com/maibu/influxdb/MowerRealTimeData.java | 101 +++++++++++ .../maibu/mapper/DeviceRunParamMapper.java | 12 ++ .../ErrorIdentificationStandardMapper.java | 0 .../java/com/maibu/memory/SiteMemory.java | 41 +++-- .../main/java/com/maibu/mqtt/MqttTopic.java | 5 + .../controller/DeviceTaskController.java | 19 ++- .../com/maibu/dto/DeviceErrorPushDTO.java | 3 +- .../com/maibu/dto/DeviceErrorPushDetail.java | 2 + .../main/java/com/maibu/init/InitThread.java | 21 ++- .../netty/handler/DeviceConnectHandler.java | 1 + .../com/maibu/service/AlertPushService.java | 158 ++++++++++++++++++ .../com/maibu/service/DevicePathService.java | 3 - .../com/maibu/service/DeviceTaskService.java | 49 ++++-- .../maibu/service/DeviceThreadService.java | 105 +++++++++--- .../com/maibu/utils/DingTalkTemplate.java | 30 ++++ .../src/main/resources/errorStandard.json | 16 +- .../com/maibu/controller/AlarmController.java | 126 +++++++++++++- .../controller/DeviceRunParamController.java | 49 ++++++ .../ErrorIdentificationController.java | 43 +++++ .../controller/IOTWorkOrderController.java | 23 ++- .../controller/WorkRecordController.java | 23 ++- .../com/maibu/dto/DeviceRunParamQueryDTO.java | 11 ++ .../java/com/maibu/dto/ErrorQueryDTO.java | 15 ++ .../java/com/maibu/mapper/AlarmMapper.java | 12 +- .../maibu/service/impl/AlarmServiceImpl.java | 119 +++++++++---- .../service/impl/DeviceRunParamService.java | 67 ++++++++ .../impl/ErrorIdentificationService.java | 48 ++++++ .../service/impl/WorkOrderServiceImpl.java | 5 +- .../maibu/service/SysDeviceModelService.java | 9 +- .../com/maibu/service/SysSiteService.java | 17 +- .../maibu/netty/handler/ClientHandler.java | 54 +++--- 44 files changed, 1328 insertions(+), 188 deletions(-) create mode 100644 maibu-common/src/main/java/com/maibu/core/business/DeviceRunParam.java create mode 100644 maibu-common/src/main/java/com/maibu/core/business/alarm_center/AlarmMessage.java create mode 100644 maibu-common/src/main/java/com/maibu/core/enums/ErrorLevel.java create mode 100644 maibu-common/src/main/java/com/maibu/core/enums/ErrorSource.java create mode 100644 maibu-common/src/main/java/com/maibu/mapper/DeviceRunParamMapper.java rename {maibu-netty-server => maibu-common}/src/main/java/com/maibu/mapper/ErrorIdentificationStandardMapper.java (100%) create mode 100644 maibu-netty-server/src/main/java/com/maibu/service/AlertPushService.java create mode 100644 maibu-netty-server/src/main/java/com/maibu/utils/DingTalkTemplate.java create mode 100644 maibu-service/maibu-iot-service/src/main/java/com/maibu/controller/DeviceRunParamController.java create mode 100644 maibu-service/maibu-iot-service/src/main/java/com/maibu/controller/ErrorIdentificationController.java create mode 100644 maibu-service/maibu-iot-service/src/main/java/com/maibu/dto/DeviceRunParamQueryDTO.java create mode 100644 maibu-service/maibu-iot-service/src/main/java/com/maibu/dto/ErrorQueryDTO.java create mode 100644 maibu-service/maibu-iot-service/src/main/java/com/maibu/service/impl/DeviceRunParamService.java create mode 100644 maibu-service/maibu-iot-service/src/main/java/com/maibu/service/impl/ErrorIdentificationService.java diff --git a/maibu-common/pom.xml b/maibu-common/pom.xml index 7385db3..8c3dbe6 100644 --- a/maibu-common/pom.xml +++ b/maibu-common/pom.xml @@ -227,8 +227,17 @@ 3.5.1 + + com.aliyun + alibaba-dingtalk-service-sdk + 2.0.0 + - + + commons-codec + commons-codec + 1.11 + diff --git a/maibu-common/src/main/java/com/maibu/core/business/Device.java b/maibu-common/src/main/java/com/maibu/core/business/Device.java index 1eb3d74..01d45fb 100644 --- a/maibu-common/src/main/java/com/maibu/core/business/Device.java +++ b/maibu-common/src/main/java/com/maibu/core/business/Device.java @@ -1,6 +1,14 @@ package com.maibu.core.business; -import com.baomidou.mybatisplus.annotation.*; +import java.math.BigDecimal; +import java.util.Date; +import java.util.Map; + +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonInclude; import com.maibu.annotation.Excel; @@ -11,12 +19,6 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; -import org.springframework.data.annotation.Transient; - -import java.math.BigDecimal; -import java.util.Date; -import java.util.List; -import java.util.Map; /** * 设备对象 iot_device @@ -228,4 +230,7 @@ public class Device extends BaseDO { @TableField(exist = false) private Map statusStatistics; + @TableField(exist = false) + private DeviceRunParam runParam; + } diff --git a/maibu-common/src/main/java/com/maibu/core/business/DeviceModel.java b/maibu-common/src/main/java/com/maibu/core/business/DeviceModel.java index e1fa799..c49dde0 100644 --- a/maibu-common/src/main/java/com/maibu/core/business/DeviceModel.java +++ b/maibu-common/src/main/java/com/maibu/core/business/DeviceModel.java @@ -1,25 +1,18 @@ package com.maibu.core.business; +import java.util.List; + import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; -import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonInclude; -import com.maibu.annotation.Excel; import com.maibu.core.domain.BaseDO; import com.maibu.core.enums.ConnectType; + import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; -import org.springframework.data.annotation.Transient; - -import java.math.BigDecimal; -import java.util.Date; -import java.util.List; -import java.util.Map; @EqualsAndHashCode(callSuper = true) diff --git a/maibu-common/src/main/java/com/maibu/core/business/DeviceRunParam.java b/maibu-common/src/main/java/com/maibu/core/business/DeviceRunParam.java new file mode 100644 index 0000000..556382c --- /dev/null +++ b/maibu-common/src/main/java/com/maibu/core/business/DeviceRunParam.java @@ -0,0 +1,27 @@ +package com.maibu.core.business; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.maibu.core.domain.BaseDO; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +@TableName(value = "iot_device_run_param", autoResultMap = true) +public class DeviceRunParam extends BaseDO { + + @TableId(type = IdType.AUTO) + private Long id; + + private String deviceId; + + private Long siteId; + + private Long orgId; + + private Double runSpeed; + +} diff --git a/maibu-common/src/main/java/com/maibu/core/business/ErrorIdentificationStandard.java b/maibu-common/src/main/java/com/maibu/core/business/ErrorIdentificationStandard.java index 0bc5a5a..84854b4 100644 --- a/maibu-common/src/main/java/com/maibu/core/business/ErrorIdentificationStandard.java +++ b/maibu-common/src/main/java/com/maibu/core/business/ErrorIdentificationStandard.java @@ -3,7 +3,10 @@ package com.maibu.core.business; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import com.maibu.core.enums.CompareEnum;import lombok.Data; +import com.maibu.core.enums.CompareEnum; +import com.maibu.core.enums.ErrorLevel; +import com.maibu.core.enums.ErrorSource; +import lombok.Data; @Data @@ -16,4 +19,8 @@ public class ErrorIdentificationStandard { private CompareEnum compareType; private String errorDescription; private String errorName; + private ErrorSource errorSource; + private String errorCode; + private ErrorLevel errorLevel; + private String suggestion; } diff --git a/maibu-common/src/main/java/com/maibu/core/business/IOTWorkOrder.java b/maibu-common/src/main/java/com/maibu/core/business/IOTWorkOrder.java index dbc36f2..76d01a5 100644 --- a/maibu-common/src/main/java/com/maibu/core/business/IOTWorkOrder.java +++ b/maibu-common/src/main/java/com/maibu/core/business/IOTWorkOrder.java @@ -1 +1,112 @@ -package com.maibu.core.business; import com.baomidou.mybatisplus.annotation.*; import com.maibu.core.domain.TenantBaseDO; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import java.math.BigDecimal; import java.time.LocalDateTime; @Data @EqualsAndHashCode(callSuper = true) @TableName("iot_work_order") @ApiModel("工单记录") public class IOTWorkOrder extends TenantBaseDO { @ApiModelProperty("主键 ID") @TableId(type = IdType.AUTO) private Long id; @ApiModelProperty("工单编号") private String orderNo; @ApiModelProperty("工单标题") private String orderTitle; @ApiModelProperty("工单来源:1-AI 诊断 2-无人机巡检 3-清洗优化 4-视频监控 5-装备控制 6-人工创建 7-告警关联") private Integer sourceType; @ApiModelProperty("工单类型:1-巡检 2-检修 3-清洗 4-维修 5-运维") private Integer orderType; @ApiModelProperty("优先级:1-高 2-中 3-低") private Integer priorityLevel; @ApiModelProperty("关联设备 ID") private Long deviceId; @ApiModelProperty("关联设备名称") private String deviceName; @ApiModelProperty("设备类型") private Integer deviceType; @ApiModelProperty("关联场站 ID") private Long siteId; @ApiModelProperty("关联场站名称") private String siteName; @ApiModelProperty("关联组织 ID") private Long orgId; @ApiModelProperty("负责人 ID") private Long assigneeId; @ApiModelProperty("负责人姓名") private String assigneeName; @ApiModelProperty("协同人员 ID 列表 (逗号分隔)") private String collaboratorIds; @ApiModelProperty("协同人员姓名列表 (逗号分隔)") private String collaboratorNames; @ApiModelProperty("计划开始时间") private LocalDateTime planStartTime; @ApiModelProperty("计划结束时间") private LocalDateTime planEndTime; @ApiModelProperty("截止时间") private LocalDateTime deadlineTime; @ApiModelProperty("实际开始时间") private LocalDateTime actualStartTime; @ApiModelProperty("实际完成时间") private LocalDateTime actualEndTime; @ApiModelProperty("工单状态:1-待处理 2-已派发 3-执行中 4-已完成 5-已挂起") private Integer orderStatus; @ApiModelProperty("关联告警 ID") private Long alarmId; @ApiModelProperty("关联告警编号") private String alarmNo; @ApiModelProperty("任务描述") private String taskDescription; @ApiModelProperty("AI 建议") private String aiSuggestion; @ApiModelProperty("建议携带设备") private String requiredEquipment; @ApiModelProperty("预计影响发电量 (%)") private BigDecimal estimatedImpact; @ApiModelProperty("处理结果") private String handleResult; @ApiModelProperty("处理备注") private String handleRemark; } \ No newline at end of file +package com.maibu.core.business; + +import com.baomidou.mybatisplus.annotation.*; +import com.maibu.core.domain.TenantBaseDO; +import com.maibu.core.enums.ErrorLevel; +import com.maibu.core.enums.ErrorSource; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("iot_work_order") +@ApiModel("工单记录") +public class IOTWorkOrder extends TenantBaseDO { + + @ApiModelProperty("主键 ID") + @TableId(type = IdType.AUTO) + private Long id; + + @ApiModelProperty("工单编号") + private String orderNo; + + @ApiModelProperty("工单标题") + private String orderTitle; + + @ApiModelProperty("工单来源:1-AI 诊断 2-无人机巡检 3-清洗优化 4-视频监控 5-装备控制 6-人工创建 7-告警关联") + private Integer sourceType; + + @ApiModelProperty("工单类型:1-巡检 2-检修 3-清洗 4-维修 5-运维") + private Integer orderType; + + @ApiModelProperty("优先级:1-高 2-中 3-低") + private ErrorLevel priorityLevel; + + @ApiModelProperty("关联设备 ID") + private String deviceId; + + @ApiModelProperty("关联设备名称") + private String deviceName; + + @ApiModelProperty("设备类型") + private ErrorSource deviceType; + + @ApiModelProperty("关联场站 ID") + private Long siteId; + + @ApiModelProperty("关联场站名称") + private String siteName; + + @ApiModelProperty("关联组织 ID") + private Long orgId; + + @ApiModelProperty("负责人 ID") + private Long assigneeId; + + @ApiModelProperty("负责人姓名") + private String assigneeName; + + @ApiModelProperty("协同人员 ID 列表 (逗号分隔)") + private String collaboratorIds; + + @ApiModelProperty("协同人员姓名列表 (逗号分隔)") + private String collaboratorNames; + + @ApiModelProperty("计划开始时间") + private LocalDateTime planStartTime; + + @ApiModelProperty("计划结束时间") + private LocalDateTime planEndTime; + + @ApiModelProperty("截止时间") + private LocalDateTime deadlineTime; + + @ApiModelProperty("实际开始时间") + private LocalDateTime actualStartTime; + + @ApiModelProperty("实际完成时间") + private LocalDateTime actualEndTime; + + @ApiModelProperty("工单状态:1-待处理 2-已派发 3-执行中 4-已完成 5-已挂起") + private Integer orderStatus; + + @ApiModelProperty("关联告警 ID") + private Long alarmId; + + @ApiModelProperty("关联告警编号") + private String alarmNo; + + @ApiModelProperty("任务描述") + private String taskDescription; + + @ApiModelProperty("AI 建议") + private String aiSuggestion; + + @ApiModelProperty("建议携带设备") + private String requiredEquipment; + + @ApiModelProperty("预计影响发电量 (%)") + private BigDecimal estimatedImpact; + + @ApiModelProperty("处理结果") + private String handleResult; + + @ApiModelProperty("处理备注") + private String handleRemark; +} diff --git a/maibu-common/src/main/java/com/maibu/core/business/alarm_center/Alarm.java b/maibu-common/src/main/java/com/maibu/core/business/alarm_center/Alarm.java index b58295a..7aece87 100644 --- a/maibu-common/src/main/java/com/maibu/core/business/alarm_center/Alarm.java +++ b/maibu-common/src/main/java/com/maibu/core/business/alarm_center/Alarm.java @@ -3,6 +3,9 @@ package com.maibu.core.business.alarm_center; import com.baomidou.mybatisplus.annotation.*; import com.maibu.annotation.Excel; import com.maibu.core.domain.TenantBaseDO; +import com.maibu.core.enums.ErrorLevel; +import com.maibu.core.enums.ErrorSource; + import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -27,7 +30,7 @@ public class Alarm extends TenantBaseDO { @ApiModelProperty("告警级别:1-严重 2-重要 3-一般 4-提示") @Excel(name = "告警级别", readConverterExp = "1=严重,2=重要,3=一般,4=提示") - private Integer alarmLevel; + private ErrorLevel alarmLevel; @ApiModelProperty("告警类型:1-设备故障 2-数据异常 3-通信中断 4-性能告警 5-安全告警 6-环境告警") @Excel(name = "告警类型", readConverterExp = "1=设备故障,2=数据异常,3=通信中断,4=性能告警,5=安全告警,6=环境告警") @@ -43,7 +46,7 @@ public class Alarm extends TenantBaseDO { @ApiModelProperty("设备ID") @Excel(name = "设备ID", cellType = Excel.ColumnType.NUMERIC) - private Long deviceId; + private String deviceId; @ApiModelProperty("设备名称") @Excel(name = "设备名称") @@ -51,7 +54,7 @@ public class Alarm extends TenantBaseDO { @ApiModelProperty("设备类型:1-逆变器 2-汇流箱 3-组串 4-气象站 5-电表 6-智能汇流箱 7-箱变 8-SVG") @Excel(name = "设备类型", readConverterExp = "1=逆变器,2=汇流箱,3=组串,4=气象站,5=电表,6=智能汇流箱,7=箱变,8=SVG") - private Integer deviceType; + private ErrorSource deviceType; @ApiModelProperty("告警发生时间") @Excel(name = "告警时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") diff --git a/maibu-common/src/main/java/com/maibu/core/business/alarm_center/AlarmMessage.java b/maibu-common/src/main/java/com/maibu/core/business/alarm_center/AlarmMessage.java new file mode 100644 index 0000000..d94ea92 --- /dev/null +++ b/maibu-common/src/main/java/com/maibu/core/business/alarm_center/AlarmMessage.java @@ -0,0 +1,43 @@ +package com.maibu.core.business.alarm_center; + +import java.time.LocalDateTime; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.maibu.core.enums.ErrorLevel; + +import lombok.Data; + +@Data +public class AlarmMessage { + + /** 告警等级 P1/P2/P3/P4 */ + private ErrorLevel level; + + /** 告警名称 */ + private String name; + + /** 告警code */ + private String no; + + /** 告警时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime time; + + /** 设备名称 */ + private String deviceName; + + /** 设备SN */ + private String deviceSn; + + /** 告警内容 */ + private String content; + + /** 所在位置 */ + private String location; + + /** 处理建议 */ + private String suggestion; + + /** 状态 */ + private String status; +} diff --git a/maibu-common/src/main/java/com/maibu/core/business/device/NettyDevice.java b/maibu-common/src/main/java/com/maibu/core/business/device/NettyDevice.java index f33cd73..f5084d4 100644 --- a/maibu-common/src/main/java/com/maibu/core/business/device/NettyDevice.java +++ b/maibu-common/src/main/java/com/maibu/core/business/device/NettyDevice.java @@ -7,7 +7,9 @@ import java.util.Queue; import org.springframework.util.CollectionUtils; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.maibu.core.business.Device; import com.maibu.core.business.DevicePlanTask; +import com.maibu.core.business.DeviceRunParam; import com.maibu.core.business.DeviceRunStatistics; import com.maibu.core.business.PlanPath; import com.maibu.core.business.WorkRecord; @@ -50,6 +52,8 @@ public class NettyDevice extends Connector { private Long latestLoginTime; private boolean executingTask = false; + // todo 注册的时候更新 siteId + private Device device; @JsonIgnore private DevicePlanTaskMapper devicePlanTaskMapper = SpringUtils.getBean(DevicePlanTaskMapper.class); @@ -74,7 +78,17 @@ public class NettyDevice extends Connector { if (!locationQueue.isEmpty()) { LatAndLngEntity entity = locationQueue.poll(); if (entity != null) { - sendPathCommand((byte) 0x01, (short) 1, entity.getLat(), entity.getLng(), (short) 1000); + short speed = 1000; + if (device != null) { + SiteMemory siteMemory = GlobalMemory.getSiteMemory(device.getOrgId(), device.getSiteId()); + if (siteMemory != null) { + DeviceRunParam deviceRunParam = siteMemory.getDeviceRunParam(device.getSerialNumber()); + if (deviceRunParam != null && deviceRunParam.getRunSpeed() != null) { + speed = deviceRunParam.getRunSpeed().shortValue(); + } + } + } + sendPathCommand((byte) 0x01, (short) 1, entity.getLat(), entity.getLng(), speed); currentPoint = entity; } } diff --git a/maibu-common/src/main/java/com/maibu/core/business/dto/AlarmQueryDTO.java b/maibu-common/src/main/java/com/maibu/core/business/dto/AlarmQueryDTO.java index af1da0e..2034e90 100644 --- a/maibu-common/src/main/java/com/maibu/core/business/dto/AlarmQueryDTO.java +++ b/maibu-common/src/main/java/com/maibu/core/business/dto/AlarmQueryDTO.java @@ -1,14 +1,14 @@ package com.maibu.core.business.dto; +import java.time.LocalDateTime; + +import org.springframework.format.annotation.DateTimeFormat; + +import com.fasterxml.jackson.annotation.JsonFormat; + import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import java.time.LocalDateTime; - -import com.fasterxml.jackson.annotation.JsonFormat; -import org.springframework.format.annotation.DateTimeFormat; -import java.time.LocalDateTime; - @Data @ApiModel("告警查询参数") @@ -46,7 +46,7 @@ public class AlarmQueryDTO { private String keyword; @ApiModelProperty("设备ID") - private Long deviceId; + private String deviceId; @ApiModelProperty("场站ID") private Long siteId; diff --git a/maibu-common/src/main/java/com/maibu/core/domain/entity/SysSite.java b/maibu-common/src/main/java/com/maibu/core/domain/entity/SysSite.java index 70e8129..6805e22 100644 --- a/maibu-common/src/main/java/com/maibu/core/domain/entity/SysSite.java +++ b/maibu-common/src/main/java/com/maibu/core/domain/entity/SysSite.java @@ -31,6 +31,14 @@ public class SysSite extends BaseDO { private String remark; - private Integer status; + private Integer dingTalkPush; // 钉钉推送 0-关闭 1-开启 + + private Integer emailPush;// 邮件推送 0-关闭 1-开启 + + private Integer alertPush;// 告警弹窗推送 0-关闭 1-开启 + + private String dingTalkSecret; // 钉钉推送密钥 + + private String dingTalkToken; // 钉钉推送token } diff --git a/maibu-common/src/main/java/com/maibu/core/enums/ErrorLevel.java b/maibu-common/src/main/java/com/maibu/core/enums/ErrorLevel.java new file mode 100644 index 0000000..5d60202 --- /dev/null +++ b/maibu-common/src/main/java/com/maibu/core/enums/ErrorLevel.java @@ -0,0 +1,21 @@ +package com.maibu.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum ErrorLevel { + + INFO("INFO", "信息"), + + WARNING("WARNING", "警告"), + + ERROR("ERROR", "错误"); + + /** 错误来源值(存储在数据库中) */ + private final String value; + + /** 错误来源名称(用于前端显示) */ + private final String name; +} diff --git a/maibu-common/src/main/java/com/maibu/core/enums/ErrorSource.java b/maibu-common/src/main/java/com/maibu/core/enums/ErrorSource.java new file mode 100644 index 0000000..265cd46 --- /dev/null +++ b/maibu-common/src/main/java/com/maibu/core/enums/ErrorSource.java @@ -0,0 +1,24 @@ +package com.maibu.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum ErrorSource { + + /** 无人机 */ + UAV("UAV", "无人机"), + + /** 割草机 */ + MOWER("MOWER", "割草机"), + + /** 其他 */ + OTHERS("OTHERS", "其他"); + + /** 错误来源值(存储在数据库中) */ + private final String value; + + /** 错误来源名称(用于前端显示) */ + private final String name; +} diff --git a/maibu-common/src/main/java/com/maibu/influxdb/MowerRealTimeData.java b/maibu-common/src/main/java/com/maibu/influxdb/MowerRealTimeData.java index 0a89495..91c790e 100644 --- a/maibu-common/src/main/java/com/maibu/influxdb/MowerRealTimeData.java +++ b/maibu-common/src/main/java/com/maibu/influxdb/MowerRealTimeData.java @@ -1,11 +1,15 @@ package com.maibu.influxdb; import java.time.Instant; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import org.springframework.util.CollectionUtils; import com.influxdb.query.FluxRecord; +import com.influxdb.query.FluxTable; import com.maibu.influxdb.inter.InfluxField; import com.maibu.influxdb.inter.InfluxMeasurement; import com.maibu.influxdb.inter.InfluxTag; @@ -152,4 +156,101 @@ public class MowerRealTimeData { return data; } + + // 适用于flux默认行存储结构,按device分组合并成一条实体 + public static Map> fluxTableMergeToEntity(List tables) { + Map tempMap = new HashMap<>(); + for (FluxTable table : tables) { + for (FluxRecord record : table.getRecords()) { + String deviceId = (String) record.getValueByKey("deviceId"); + Instant time = record.getTime(); + String fieldName = (String) record.getValueByKey("_field"); + String fieldVal = (String) record.getValueByKey("_value"); + + // 唯一key:设备+时间 + String key = deviceId + "_" + time.toEpochMilli(); + MowerRealTimeData data = tempMap.getOrDefault(key, new MowerRealTimeData()); + data.setTime(time); + data.setDeviceId(deviceId); + + // 根据_field填充对应属性 + switch (fieldName) { + case "voltage": + data.setVoltage(fieldVal); + break; + case "leftTargetSpeed": + data.setLeftTargetSpeed(fieldVal); + break; + case "rightTargetSpeed": + data.setRightTargetSpeed(fieldVal); + break; + case "leftMeasureSpeed": + data.setLeftMeasureSpeed(fieldVal); + break; + case "rightMeasureSpeed": + data.setRightMeasureSpeed(fieldVal); + break; + case "leftMotorTemp": + data.setLeftMotorTemp(fieldVal); + break; + case "rightMotorTemp": + data.setRightMotorTemp(fieldVal); + break; + case "leftCurrent": + data.setLeftCurrent(fieldVal); + break; + case "rightCurrent": + data.setRightCurrent(fieldVal); + break; + case "chipTemp": + data.setChipTemp(fieldVal); + break; + case "yaw": + data.setYaw(fieldVal); + break; + case "pitch": + data.setPitch(fieldVal); + break; + case "roll": + data.setRoll(fieldVal); + break; + case "satelliteCnt": + data.setSatelliteCnt(fieldVal); + break; + case "qual": + data.setQual(fieldVal); + break; + case "headingStatus": + data.setHeadingStatus(fieldVal); + break; + case "latitude": + data.setLatitude(fieldVal); + break; + case "longitude": + data.setLongitude(fieldVal); + break; + case "cuttingSpeed": + data.setCuttingSpeed(fieldVal); + break; + case "controlMode": + data.setControlMode(fieldVal); + break; + case "battery": + data.setBattery(fieldVal); + break; + case "workingArea": + data.setWorkingArea(fieldVal); + break; + case "obstacleSign": + data.setObstacleSign(fieldVal); + break; + } + tempMap.put(key, data); + } + } + // 转List返回 + return tempMap.values().stream() + .collect(Collectors.groupingBy(MowerRealTimeData::getDeviceId)); + } + } diff --git a/maibu-common/src/main/java/com/maibu/mapper/DeviceRunParamMapper.java b/maibu-common/src/main/java/com/maibu/mapper/DeviceRunParamMapper.java new file mode 100644 index 0000000..5312184 --- /dev/null +++ b/maibu-common/src/main/java/com/maibu/mapper/DeviceRunParamMapper.java @@ -0,0 +1,12 @@ +package com.maibu.mapper; + +import org.springframework.stereotype.Repository; + +import com.maibu.core.business.DeviceRunParam; +import com.maibu.mybatis.mapper.BaseMapperX; + + +@Repository +public interface DeviceRunParamMapper extends BaseMapperX { + +} diff --git a/maibu-netty-server/src/main/java/com/maibu/mapper/ErrorIdentificationStandardMapper.java b/maibu-common/src/main/java/com/maibu/mapper/ErrorIdentificationStandardMapper.java similarity index 100% rename from maibu-netty-server/src/main/java/com/maibu/mapper/ErrorIdentificationStandardMapper.java rename to maibu-common/src/main/java/com/maibu/mapper/ErrorIdentificationStandardMapper.java diff --git a/maibu-common/src/main/java/com/maibu/memory/SiteMemory.java b/maibu-common/src/main/java/com/maibu/memory/SiteMemory.java index 72e9841..6e283ea 100644 --- a/maibu-common/src/main/java/com/maibu/memory/SiteMemory.java +++ b/maibu-common/src/main/java/com/maibu/memory/SiteMemory.java @@ -1,8 +1,8 @@ package com.maibu.memory; - import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; @@ -13,8 +13,11 @@ import org.springframework.util.CollectionUtils; import com.maibu.core.business.Device; import com.maibu.core.business.DevicePlan; import com.maibu.core.business.DevicePlanTask; +import com.maibu.core.business.DeviceRunParam; import com.maibu.core.business.ErrorIdentificationStandard; import com.maibu.core.business.IoTCommonDevice; +import com.maibu.core.domain.entity.SysSite; +import com.maibu.core.enums.ErrorSource; import lombok.Data; import lombok.extern.slf4j.Slf4j; @@ -24,19 +27,23 @@ import lombok.extern.slf4j.Slf4j; @Slf4j public class SiteMemory { - public List standard = null; + public Map> standards = null; public Long siteId; + public SysSite sysSite; + + public static final ConcurrentHashMap deviceRunParamMap = new ConcurrentHashMap<>(); + private static final ConcurrentHashMap deviceMap = new ConcurrentHashMap<>(); private static final ConcurrentHashMap commonDeviceMap = new ConcurrentHashMap<>(); - //key deviceId + // key deviceId public static ConcurrentHashMap> devicePlanMap = new ConcurrentHashMap<>(); - //key deviceId prepare + // key deviceId prepare public static ConcurrentHashMap> devicePlanTaskPrepareMap = new ConcurrentHashMap<>(); - //key deviceId execute + // key deviceId execute public static ConcurrentHashMap devicePlanTaskExecuteMap = new ConcurrentHashMap<>(); public static void saveDevice(Device device) { @@ -49,6 +56,23 @@ public class SiteMemory { } } + public void saveDeviceRunParam(DeviceRunParam deviceRunParam) { + deviceRunParamMap.put(deviceRunParam.getDeviceId(), deviceRunParam); + } + + public DeviceRunParam getDeviceRunParam(String deviceId) { + if (!StringUtils.isEmpty(deviceId)) { + return deviceRunParamMap.get(deviceId); + } + return null; + } + + public void removeDeviceRunParam(String deviceId) { + if (!StringUtils.isEmpty(deviceId)) { + deviceRunParamMap.remove(deviceId); + } + } + public void addDevicePlan(DevicePlan devicePlan) { if (devicePlan != null && !StringUtils.isEmpty(devicePlan.getDeviceId())) { String deviceId = devicePlan.getDeviceId(); @@ -65,7 +89,6 @@ public class SiteMemory { } } - public void removeDevicePlan(DevicePlan devicePlan) { if (devicePlan != null && !StringUtils.isEmpty(devicePlan.getDeviceId())) { String deviceId = devicePlan.getDeviceId(); @@ -98,7 +121,6 @@ public class SiteMemory { } } - public void addDevicePlanExecute(DevicePlanTask devicePlanTask) { if (devicePlanTask != null && !StringUtils.isEmpty(devicePlanTask.getDeviceId())) { String deviceId = devicePlanTask.getDeviceId(); @@ -120,12 +142,9 @@ public class SiteMemory { public DevicePlanTask getDeviceExecuteTask(String deviceId) { if (!StringUtils.isEmpty(deviceId)) { - return devicePlanTaskExecuteMap.get(deviceId); + return devicePlanTaskExecuteMap.get(deviceId); } return null; } - - - } diff --git a/maibu-common/src/main/java/com/maibu/mqtt/MqttTopic.java b/maibu-common/src/main/java/com/maibu/mqtt/MqttTopic.java index 4b2aa3a..53191e8 100644 --- a/maibu-common/src/main/java/com/maibu/mqtt/MqttTopic.java +++ b/maibu-common/src/main/java/com/maibu/mqtt/MqttTopic.java @@ -7,4 +7,9 @@ public class MqttTopic { public static final String DEVICE_TASK_STATUS_TOPIC = "task/%s/status"; // 任务状态 完成、取消、暂停、继续 public static final String DEVICE_TASK_ARRIVE_TOPIC = "task/%s/arrive"; // 任务到达 + + public static final String DEVICE_ERROR_PUSH_TOPIC = "device/%s/error"; // 设备错误推送 + + } + \ No newline at end of file diff --git a/maibu-netty-server/src/main/java/com/maibu/controller/DeviceTaskController.java b/maibu-netty-server/src/main/java/com/maibu/controller/DeviceTaskController.java index 01bd23d..33a48b5 100644 --- a/maibu-netty-server/src/main/java/com/maibu/controller/DeviceTaskController.java +++ b/maibu-netty-server/src/main/java/com/maibu/controller/DeviceTaskController.java @@ -1,6 +1,17 @@ package com.maibu.controller; -import com.github.pagehelper.PageHelper; +import java.time.LocalDate; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + import com.maibu.core.business.DevicePlan; import com.maibu.core.controller.BaseController; import com.maibu.core.domain.AjaxResult; @@ -13,12 +24,6 @@ import com.maibu.memory.GlobalMemory; import com.maibu.memory.SiteMemory; import com.maibu.service.DeviceTaskService; import com.maibu.utils.SecurityUtils; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.format.annotation.DateTimeFormat; -import org.springframework.web.bind.annotation.*; - -import java.time.LocalDate; @RestController @RequestMapping("/iot/deviceTask") diff --git a/maibu-netty-server/src/main/java/com/maibu/dto/DeviceErrorPushDTO.java b/maibu-netty-server/src/main/java/com/maibu/dto/DeviceErrorPushDTO.java index f49b2c3..e113823 100644 --- a/maibu-netty-server/src/main/java/com/maibu/dto/DeviceErrorPushDTO.java +++ b/maibu-netty-server/src/main/java/com/maibu/dto/DeviceErrorPushDTO.java @@ -1,5 +1,6 @@ package com.maibu.dto; +import com.maibu.core.business.alarm_center.AlarmMessage; import com.maibu.core.enums.RespondCode; import lombok.Data; @@ -8,7 +9,7 @@ import java.util.List; @Data public class DeviceErrorPushDTO { - private List details; + private List details; private long time; diff --git a/maibu-netty-server/src/main/java/com/maibu/dto/DeviceErrorPushDetail.java b/maibu-netty-server/src/main/java/com/maibu/dto/DeviceErrorPushDetail.java index ae0b6de..52a7e20 100644 --- a/maibu-netty-server/src/main/java/com/maibu/dto/DeviceErrorPushDetail.java +++ b/maibu-netty-server/src/main/java/com/maibu/dto/DeviceErrorPushDetail.java @@ -7,6 +7,8 @@ public class DeviceErrorPushDetail { private String errorName; + private String errorCode; + private String description; private String range; diff --git a/maibu-netty-server/src/main/java/com/maibu/init/InitThread.java b/maibu-netty-server/src/main/java/com/maibu/init/InitThread.java index 3edad51..fe00fa2 100644 --- a/maibu-netty-server/src/main/java/com/maibu/init/InitThread.java +++ b/maibu-netty-server/src/main/java/com/maibu/init/InitThread.java @@ -18,11 +18,13 @@ import org.springframework.util.CollectionUtils; import com.maibu.constant.FastBeeConstant; import com.maibu.core.business.DevicePlan; import com.maibu.core.business.DevicePlanTask; +import com.maibu.core.business.DeviceRunParam; import com.maibu.core.domain.entity.SysSite; import com.maibu.core.enums.DeviceTaskStaus; import com.maibu.influxdb.util.InfluxDBUtil; import com.maibu.mapper.DevicePlanMapper; import com.maibu.mapper.DevicePlanTaskMapper; +import com.maibu.mapper.DeviceRunParamMapper; import com.maibu.mapper.SysSiteMapper; import com.maibu.memory.GlobalMemory; import com.maibu.memory.SiteMemory; @@ -59,6 +61,9 @@ public class InitThread implements ApplicationRunner { @Autowired private SysSiteMapper sysSiteMapper; + @Autowired + private DeviceRunParamMapper deviceRunParamMapper; + @Value("${influxdb.url}") private String influxDBUrl; @@ -127,9 +132,6 @@ public class InitThread implements ApplicationRunner { * 恢复内存 */ public void recoverMemory() { - // todo 启动时清除当前登录记录 - // System.out.println("开始清除登录信息"); - // sysUserClientMapper.clearDeviceName(); List siteList = sysSiteMapper.selectList(); if (!CollectionUtils.isEmpty(siteList)) { siteList.forEach(x -> { @@ -138,10 +140,23 @@ public class InitThread implements ApplicationRunner { SiteMemory siteMemory = GlobalMemory.getSiteMemory(orgId, siteId); if (siteMemory == null) { siteMemory = new SiteMemory(); + siteMemory.setSiteId(siteId); + siteMemory.setSysSite(x); GlobalMemory.addSiteMemory(orgId, siteId, siteMemory); } }); } + List deviceRunParamList = deviceRunParamMapper.selectList(); + if (!CollectionUtils.isEmpty(deviceRunParamList)) { + deviceRunParamList.forEach(x -> { + Long orgId = x.getOrgId(); + Long siteId = x.getId(); + SiteMemory siteMemory = GlobalMemory.getSiteMemory(orgId, siteId); + if (siteMemory != null) { + siteMemory.saveDeviceRunParam(x); + } + }); + } // 未执行完的重复计划 LambdaQueryWrapperX query = new LambdaQueryWrapperX<>(); List list = Arrays.asList(DeviceTaskStaus.NEW.getCode(), DeviceTaskStaus.EXECUTING.getCode(), diff --git a/maibu-netty-server/src/main/java/com/maibu/netty/handler/DeviceConnectHandler.java b/maibu-netty-server/src/main/java/com/maibu/netty/handler/DeviceConnectHandler.java index 1f1ff00..cc6a0fc 100644 --- a/maibu-netty-server/src/main/java/com/maibu/netty/handler/DeviceConnectHandler.java +++ b/maibu-netty-server/src/main/java/com/maibu/netty/handler/DeviceConnectHandler.java @@ -289,6 +289,7 @@ public class DeviceConnectHandler extends SimpleChannelInboundHandler { NettyDevice slaveDevice = sessionManager.getDevice(data); if (slaveDevice != null) { slaveDevice.setOnlineStatus(1); + slaveDevice.setDevice(device); } // 推送json 找到设备绑定的主机进行推送 List controlMasters = sessionManager.getAllSlaveControl(device.getSerialNumber()); diff --git a/maibu-netty-server/src/main/java/com/maibu/service/AlertPushService.java b/maibu-netty-server/src/main/java/com/maibu/service/AlertPushService.java new file mode 100644 index 0000000..d3b5be7 --- /dev/null +++ b/maibu-netty-server/src/main/java/com/maibu/service/AlertPushService.java @@ -0,0 +1,158 @@ +package com.maibu.service; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.time.LocalDateTime; +import java.util.List; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; + +import org.apache.commons.codec.binary.Base64; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import com.dingtalk.api.DefaultDingTalkClient; +import com.dingtalk.api.DingTalkClient; +import com.dingtalk.api.request.OapiRobotSendRequest; +import com.dingtalk.api.response.OapiRobotSendResponse; +import com.maibu.core.business.alarm_center.Alarm; +import com.maibu.core.business.alarm_center.AlarmMessage; +import com.maibu.core.business.device.NettyDevice; +import com.maibu.dto.DeviceErrorPushDTO; +import com.maibu.dto.DeviceErrorPushDetail; +import com.maibu.manager.DeviceSessionManager; +import com.maibu.memory.GlobalMemory; +import com.maibu.memory.SiteMemory; +import com.maibu.service.impl.AlarmServiceImpl; +import com.maibu.utils.DingTalkTemplate; +import com.maibu.utils.SecurityUtils; +import com.taobao.api.ApiException; + +import lombok.extern.slf4j.Slf4j; + +@Service +@Slf4j +public class AlertPushService { + + @Autowired + private DeviceSessionManager sessionManager; + + @Autowired + private AlarmServiceImpl alarmService; + + public void messagePushHandler(String deviceId, List dtos) { + NettyDevice nettyDevice = sessionManager.getDevice(deviceId); + if (nettyDevice != null && nettyDevice.getDevice() != null) { + Long siteId = nettyDevice.getDevice().getSiteId(); + Long orgId = nettyDevice.getDevice().getOrgId(); + SiteMemory siteMemory = GlobalMemory.getSiteMemory(orgId, siteId); + if (siteMemory != null) { + Integer dingTalkPush = siteMemory.getSysSite().getDingTalkPush(); + Integer emailPush = siteMemory.getSysSite().getEmailPush(); + Integer alertPush = siteMemory.getSysSite().getAlertPush(); + String secret = siteMemory.getSysSite().getDingTalkSecret(); + String token = siteMemory.getSysSite().getDingTalkToken(); + dtos.forEach(dto -> { + if (!CollectionUtils.isEmpty(dto.getDetails())) { + dto.getDetails().forEach(detail -> { + if (dingTalkPush == 1) { + pushDingTalkMessage(secret, token, DingTalkTemplate.buildText(detail)); + } + if (emailPush == 1) { + pushEmailMessage(null, null); + } + }); + if (alertPush == 1) { + alarmService.pushAlertMes(dto.getDetails()); + } + } + }); + + } + } + } + + public void pushDingTalkMessage(String secret, String token, String alertMessage) { + try { + Long timestamp = System.currentTimeMillis(); + String stringToSign = timestamp + "\n" + secret; + Mac mac = Mac.getInstance("HmacSHA256"); + mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256")); + byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8")); + String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8"); + + // sign字段和timestamp字段必须拼接到请求URL上,否则会出现 310000 的错误信息 + DingTalkClient client = new DefaultDingTalkClient( + "https://oapi.dingtalk.com/robot/send?sign=" + sign + "×tamp=" + timestamp); + OapiRobotSendRequest req = new OapiRobotSendRequest(); + // 定义文本内容 + OapiRobotSendRequest.Text text = new OapiRobotSendRequest.Text(); + text.setContent(alertMessage); + // 定义 @ 对象 + // OapiRobotSendRequest.At at = new OapiRobotSendRequest.At(); + // at.setAtUserIds(Arrays.asList(USER_ID)); + // 设置消息类型 + req.setMsgtype("text"); + req.setText(text); + // req.setAt(at); + client.execute(req, token); + } catch (Exception e) { + e.printStackTrace(); + log.error("发送钉钉消息失败:{}", e.getMessage()); + } + } + + public void pushEmailMessage(String deviceId, String errorMessage) { + // Implement the logic to push error messages to the appropriate channels + // This could involve sending notifications, logging errors, etc. + System.out.println("Error for device " + deviceId + ": " + errorMessage); + } + + public static void main(String[] args) { + try { + Long timestamp = System.currentTimeMillis(); + System.out.println(timestamp); + String secret = "SEC6e538cab506df2efda5d327dfe582f8fd12ac55b77664d662031e90d2a3a3887"; + String stringToSign = timestamp + "\n" + secret; + Mac mac = Mac.getInstance("HmacSHA256"); + mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256")); + byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8")); + String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8"); + System.out.println(sign); + + // sign字段和timestamp字段必须拼接到请求URL上,否则会出现 310000 的错误信息 + DingTalkClient client = new DefaultDingTalkClient( + "https://oapi.dingtalk.com/robot/send?sign=" + sign + "×tamp=" + timestamp); + OapiRobotSendRequest req = new OapiRobotSendRequest(); + /** + * 发送文本消息 + */ + // 定义文本内容 + OapiRobotSendRequest.Text text = new OapiRobotSendRequest.Text(); + text.setContent("昀姐牛逼"); + // 定义 @ 对象 + OapiRobotSendRequest.At at = new OapiRobotSendRequest.At(); + // at.setAtUserIds(Arrays.asList(USER_ID)); + // 设置消息类型 + req.setMsgtype("text"); + req.setText(text); + req.setAt(at); + OapiRobotSendResponse rsp = client.execute(req, + "8bfdf609c7edeff5f31c6a243088d2a4f6672221afc86c008ad8622156a58407"); + System.out.println(rsp.getBody()); + } catch (ApiException e) { + e.printStackTrace(); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } catch (InvalidKeyException e) { + throw new RuntimeException(e); + } + } + +} \ No newline at end of file diff --git a/maibu-netty-server/src/main/java/com/maibu/service/DevicePathService.java b/maibu-netty-server/src/main/java/com/maibu/service/DevicePathService.java index f48c4a4..3155557 100644 --- a/maibu-netty-server/src/main/java/com/maibu/service/DevicePathService.java +++ b/maibu-netty-server/src/main/java/com/maibu/service/DevicePathService.java @@ -2,9 +2,6 @@ package com.maibu.service; import org.springframework.stereotype.Service; -import java.util.LinkedList; -import java.util.Queue; - @Service public class DevicePathService { diff --git a/maibu-netty-server/src/main/java/com/maibu/service/DeviceTaskService.java b/maibu-netty-server/src/main/java/com/maibu/service/DeviceTaskService.java index 185c65b..6681fda 100644 --- a/maibu-netty-server/src/main/java/com/maibu/service/DeviceTaskService.java +++ b/maibu-netty-server/src/main/java/com/maibu/service/DeviceTaskService.java @@ -1,32 +1,45 @@ package com.maibu.service; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.maibu.core.business.*; -import com.maibu.core.business.device.NettyDevice; -import com.maibu.core.domain.entity.SysSite; -import com.maibu.core.domain.model.LoginUser; -import com.maibu.core.enums.DeviceTaskStaus; -import com.maibu.dto.*; -import com.maibu.manager.DeviceSessionManager; -import com.maibu.mapper.*; -import com.maibu.memory.GlobalMemory; -import com.maibu.memory.SiteMemory; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; - import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Comparator; import java.util.List; -import java.util.Objects; import java.util.Random; import java.util.stream.Collectors; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.maibu.core.business.Device; +import com.maibu.core.business.DevicePlan; +import com.maibu.core.business.DevicePlanTask; +import com.maibu.core.business.DeviceTaskPlanRule; +import com.maibu.core.business.WorkRecord; +import com.maibu.core.business.device.NettyDevice; +import com.maibu.core.domain.entity.SysSite; +import com.maibu.core.domain.model.LoginUser; +import com.maibu.core.enums.DeviceTaskStaus; +import com.maibu.dto.DevicePlanStatisticsDTO; +import com.maibu.dto.DevicePlanTaskStatisticsDTO; +import com.maibu.dto.DeviceTaskCommandDTO; +import com.maibu.dto.DeviceTaskQueryDTO; +import com.maibu.dto.DeviceWorkStatisticsDTO; +import com.maibu.manager.DeviceSessionManager; +import com.maibu.mapper.DeviceMapper; +import com.maibu.mapper.DevicePlanMapper; +import com.maibu.mapper.DevicePlanTaskMapper; +import com.maibu.mapper.SysSiteMapper; +import com.maibu.mapper.WorkRecordMapper; +import com.maibu.memory.GlobalMemory; +import com.maibu.memory.SiteMemory; + +import lombok.extern.slf4j.Slf4j; + @Service @Slf4j public class DeviceTaskService { diff --git a/maibu-netty-server/src/main/java/com/maibu/service/DeviceThreadService.java b/maibu-netty-server/src/main/java/com/maibu/service/DeviceThreadService.java index 223901e..6c5feee 100644 --- a/maibu-netty-server/src/main/java/com/maibu/service/DeviceThreadService.java +++ b/maibu-netty-server/src/main/java/com/maibu/service/DeviceThreadService.java @@ -1,6 +1,5 @@ package com.maibu.service; - import cn.hutool.core.io.IoUtil; import com.alibaba.fastjson2.JSON; import com.maibu.common.CommandConstant; @@ -8,21 +7,29 @@ import com.maibu.common.NettyCacheKey; import com.maibu.core.business.DeviceRunningStatusHistory; import com.maibu.core.business.DeviceStatusRecordDTO; import com.maibu.core.enums.CompareEnum; +import com.maibu.core.enums.ErrorSource; import com.maibu.core.enums.RespondCode; import com.maibu.core.redis.RedisCache; import com.maibu.dto.DeviceErrorPushDTO; import com.maibu.dto.DeviceErrorPushDetail; import com.maibu.core.business.device.NettyDevice; +import com.maibu.core.business.inter.WebsocketMesDispather; import com.maibu.core.business.ErrorIdentificationStandard; +import com.maibu.core.business.alarm_center.AlarmMessage; import com.maibu.manager.DeviceSessionManager; import com.maibu.mapper.ErrorIdentificationStandardMapper; +import com.maibu.memory.GlobalMemory; import com.maibu.memory.SiteMemory; +import com.maibu.mqtt.MqttTopic; import com.maibu.utils.CommandUtils; import com.maibu.utils.CompareUtils; +import com.maibu.utils.json.JsonUtils; + import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.eclipse.paho.client.mqttv3.MqttException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; @@ -31,10 +38,12 @@ import org.springframework.util.CollectionUtils; import java.io.IOException; import java.lang.reflect.Field; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -58,6 +67,11 @@ public class DeviceThreadService { @Autowired private ErrorIdentificationStandardMapper standardMapper; + @Autowired + private WebsocketMesDispather websocketMesDispather; + + @Autowired + private AlertPushService alertPushService; public void deviceErrorMonitor() throws InterruptedException, IOException { initStandard(); @@ -68,12 +82,15 @@ public class DeviceThreadService { String key = NettyCacheKey.deviceRunningStatusKey; Collection keys = redisCache.getListKeyByPrefix(key); if (!CollectionUtils.isEmpty(keys)) { + List pushList = new ArrayList<>(); keys.forEach(k -> { DeviceStatusRecordDTO recordDTO = redisCache.getCacheObject(k); if (recordDTO != null && !CollectionUtils.isEmpty(recordDTO.getHistories())) { - recordDTO.getHistories().sort(Comparator.comparing(DeviceRunningStatusHistory::getCreateTime).reversed()); + recordDTO.getHistories() + .sort(Comparator.comparing(DeviceRunningStatusHistory::getCreateTime).reversed()); DeviceRunningStatusHistory history = recordDTO.getHistories().get(0); - List compared = compareErrorStandard(history, siteMemory.standard); + List compared = compareErrorStandard(history, + siteMemory.standards.get(ErrorSource.MOWER)); String[] parts = k.split(":"); String deviceId = parts[1]; @@ -83,10 +100,18 @@ public class DeviceThreadService { pushDTO.setTime(System.currentTimeMillis()); pushDTO.setDetails(compared); pushDTO.setEvent(RespondCode.device_error_push); - //todo push 推送到前端 - pushErrorMessage(deviceId, JSON.toJSONString(pushDTO)); + pushList.add(pushDTO); } }); + // 按实际deviceId分组,推送错误信息 + Map> pushMap = pushList.stream() + .collect(java.util.stream.Collectors.groupingBy(DeviceErrorPushDTO::getDeviceId)); + pushMap.forEach((deviceId, dtos) -> { + // pushErrorMessage(deviceId, JSON.toJSONString(dtos)); + // todo 判断错误级别,是否需要推送邮件 或者钉钉。 + // 找到这个设备的场站 添加场站是否开启关闭 钉钉或者邮件推送,推送邮件 添加人员是否订阅邮件,钉钉是加入钉钉群 + alertPushService.messagePushHandler(deviceId, dtos); + }); } } catch (Exception e) { log.error("执行监测错误线程错误:{}", e.getMessage()); @@ -95,35 +120,56 @@ public class DeviceThreadService { } public void initStandard() throws IOException { - if (siteMemory.standard == null) { - List standards = standardMapper.selectList(); - if (CollectionUtils.isEmpty(standards)) { + if (siteMemory.standards == null) { + List list = standardMapper.selectList(); + if (CollectionUtils.isEmpty(list)) { // 读取resource目录下的device-config.json文件 Resource resource = resourceLoader.getResource("classpath:errorStandard.json"); // 使用fastjson2转换为DeviceConfig对象 String jsonContent = IoUtil.readUtf8(resource.getInputStream()); - siteMemory.standard = JSON.parseArray(jsonContent, ErrorIdentificationStandard.class); + List newStandards = JSON.parseArray(jsonContent, + ErrorIdentificationStandard.class); + if (!CollectionUtils.isEmpty(newStandards)) { + standardMapper.insertBatch(newStandards); + siteMemory.standards = newStandards.stream() + .collect(java.util.stream.Collectors + .groupingBy(ErrorIdentificationStandard::getErrorSource)); + } } else { - siteMemory.standard = standards; + siteMemory.standards = list.stream() + .collect(java.util.stream.Collectors.groupingBy(ErrorIdentificationStandard::getErrorSource)); } } } public void pushErrorMessage(String deviceId, String dto) { - NettyDevice device = sessionManager.getDevice(deviceId); - if (device != null) { - ByteBuf buf = Unpooled.buffer(); - CommandUtils.buildCommand(buf, dto, CommandConstant.interaction); - if (device.getChannel() != null && device.getChannel().isActive()) { - device.getChannel().writeAndFlush(buf); + // NettyDevice device = sessionManager.getDevice(deviceId); + // if (device != null) { + // ByteBuf buf = Unpooled.buffer(); + // CommandUtils.buildCommand(buf, dto, CommandConstant.interaction); + // if (device.getChannel() != null && device.getChannel().isActive()) { + // device.getChannel().writeAndFlush(buf); + // } + // } + try { + GlobalMemory.mqttClientUtil.publish(String.format(MqttTopic.DEVICE_ERROR_PUSH_TOPIC, deviceId), dto); + List controlMasters = sessionManager.getAllSlaveControl(deviceId); + if (!CollectionUtils.isEmpty(controlMasters)) { + controlMasters.forEach(x -> { + websocketMesDispather.dispather(x.getConnectorId(), dto); + log.info("推送错误信息 device:{},content:{}", deviceId, dto); + }); } + } catch (MqttException e) { + log.error("推送错误信息失败 device:{}error:{}", deviceId, e.getMessage()); } } - - public List compareErrorStandard(DeviceRunningStatusHistory history, List standards) { - if (history == null || CollectionUtils.isEmpty(standards)) return null; - List list = new ArrayList<>(); + public List compareErrorStandard(DeviceRunningStatusHistory history, + List standards) { + if (history == null || CollectionUtils.isEmpty(standards)) + return null; + List list = new ArrayList<>(); standards.forEach(standard -> { String fieldName = standard.getField(); String compareValues = standard.getCompareValues(); @@ -132,19 +178,24 @@ public class DeviceThreadService { if (!StringUtils.isEmpty(compareValues) && !StringUtils.isEmpty(targetValue)) { boolean result = CompareUtils.compare(compareType, compareValues, targetValue); if (!result) { - DeviceErrorPushDetail detail = new DeviceErrorPushDetail(); - detail.setErrorName(standard.getErrorName()); - detail.setDescription(standard.getErrorDescription()); - detail.setValue(targetValue); - detail.setRange(compareValues); - list.add(detail); + AlarmMessage alarm = new AlarmMessage(); + alarm.setContent(standard.getErrorDescription()); + alarm.setDeviceSn(history.getDeviceId()); + alarm.setDeviceName(history.getDeviceId()); + alarm.setLevel(standard.getErrorLevel()); + alarm.setLocation(history.getLatitude() + "," + history.getLongitude()); + alarm.setName(standard.getErrorName()); + alarm.setNo(standard.getErrorCode()); + alarm.setSuggestion(standard.getSuggestion()); + alarm.setStatus("未处理"); + alarm.setTime(LocalDateTime.now()); + list.add(alarm); } } }); return list; } - private static String knownClassFieldFinding(String fieldName, DeviceRunningStatusHistory history) { try { // 1. 获取类的Class对象 diff --git a/maibu-netty-server/src/main/java/com/maibu/utils/DingTalkTemplate.java b/maibu-netty-server/src/main/java/com/maibu/utils/DingTalkTemplate.java new file mode 100644 index 0000000..8b0d6ff --- /dev/null +++ b/maibu-netty-server/src/main/java/com/maibu/utils/DingTalkTemplate.java @@ -0,0 +1,30 @@ +package com.maibu.utils; + +import com.maibu.core.business.alarm_center.AlarmMessage; + +public class DingTalkTemplate { + + public static String buildText(AlarmMessage alarm) { + return String.format( + "【系统告警通知】\n\n" + + "⚠️ 告警等级:%s\n\n" + + "告警名称:%s\n\n" + + "告警时间:%s\n\n" + + "设备名称:%s\n\n" + + "设备编号:%s\n\n" + + "告警内容:\n%s\n\n" + + "发生位置:\n%s\n\n" + + "处理建议:\n%s\n\n" + + "状态:%s", + alarm.getLevel(), + alarm.getName(), + alarm.getTime(), + alarm.getDeviceName(), + alarm.getDeviceSn(), + alarm.getContent(), + alarm.getLocation(), + alarm.getSuggestion(), + alarm.getStatus()); + + } +} diff --git a/maibu-netty-server/src/main/resources/errorStandard.json b/maibu-netty-server/src/main/resources/errorStandard.json index a006d8f..38d2ff8 100644 --- a/maibu-netty-server/src/main/resources/errorStandard.json +++ b/maibu-netty-server/src/main/resources/errorStandard.json @@ -1,16 +1,24 @@ [ { "field": "voltage", + "errorCode": "1001", "compareValues": 58, "compareType": "GT", - "errorName" : "电压过高", - "errorDescription" : "当前电池电压过高,超过正常范围" + "errorName": "电压过高", + "errorDescription": "当前电池电压过高,超过正常范围", + "errorSource": "MOWER", + "errorLevel": "WARNING", + "suggestion": "请检查电池连接或更换电池" }, { "field": "battery", + "errorCode": "1002", "compareValues": 20, "compareType": "LT", - "errorName" : "电量过低", - "errorDescription" : "当前电池电量过低,请及时充电" + "errorName": "电量过低", + "errorDescription": "当前电池电量过低,请及时充电", + "errorSource": "MOWER", + "errorLevel": "WARNING", + "suggestion": "请检查电池电量,及时充电" } ] \ No newline at end of file diff --git a/maibu-service/maibu-iot-service/src/main/java/com/maibu/controller/AlarmController.java b/maibu-service/maibu-iot-service/src/main/java/com/maibu/controller/AlarmController.java index f065b27..080ef4f 100644 --- a/maibu-service/maibu-iot-service/src/main/java/com/maibu/controller/AlarmController.java +++ b/maibu-service/maibu-iot-service/src/main/java/com/maibu/controller/AlarmController.java @@ -1 +1,125 @@ -package com.maibu.controller; import com.maibu.annotation.Log;import com.maibu.core.business.alarm_center.Alarm;import com.maibu.core.business.dto.AlarmHandleDTO; import com.maibu.core.business.dto.AlarmQueryDTO; import com.maibu.core.controller.BaseController;import com.maibu.core.domain.AjaxResult; import com.maibu.core.page.TableDataInfo; import com.maibu.enums.BusinessType; import com.maibu.service.IAlarmService; import com.maibu.utils.poi.ExcelUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize;import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse;import java.util.List;import java.util.Map;import static com.maibu.utils.PageUtils.startPage; @Api("告警中心接口") @RestController @Slf4j @RequestMapping("/iot/alarm") public class AlarmController extends BaseController{ @Autowired private IAlarmService alarmService; // @PreAuthorize("@ss.hasPermi('iot:alarm:list')") @GetMapping("/list") @ApiOperation("告警分页列表") public TableDataInfo list(AlarmQueryDTO queryDTO) { // startPage(); // return alarmService.selectAlarmPage(queryDTO); return alarmService.selectAlarmPage(queryDTO); } // @PreAuthorize("@ss.hasPermi('iot:alarm:query')") @GetMapping("/{id}") @ApiOperation("获取告警详情") public AjaxResult getInfo(@PathVariable Long id) { return AjaxResult.success(alarmService.selectAlarmById(id)); } // @PreAuthorize("@ss.hasPermi('iot:alarm:add')") @Log(title = "告警", businessType = BusinessType.INSERT) @PostMapping @ApiOperation("新增告警") public AjaxResult add(@RequestBody Alarm alarm) { return toAjax(alarmService.insertAlarm(alarm)); } // @PreAuthorize("@ss.hasPermi('iot:alarm:edit')") @Log(title = "告警", businessType = BusinessType.UPDATE) @PutMapping @ApiOperation("修改告警") public AjaxResult edit(@RequestBody Alarm alarm) { return toAjax(alarmService.updateAlarm(alarm)); } //@PreAuthorize("@ss.hasPermi('iot:alarm:handle')") @Log(title = "告警处理", businessType = BusinessType.UPDATE) @PutMapping("/handle") @ApiOperation("处理告警") public AjaxResult handle(@RequestBody AlarmHandleDTO handleDTO) { return toAjax(alarmService.handleAlarm(handleDTO)); } // @PreAuthorize("@ss.hasPermi('iot:alarm:remove')") @Log(title = "告警", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") @ApiOperation("删除告警") public AjaxResult remove(@PathVariable Long[] ids) { return toAjax(alarmService.deleteAlarmByIds(ids)); } // @PreAuthorize("@ss.hasPermi('iot:alarm:statistics')") // @GetMapping("/statistics") // @ApiOperation("告警统计") // public AjaxResult statistics() { // Map statistics = alarmService.getAlarmStatistics(); // return AjaxResult.success(statistics); // } @GetMapping("/statistics") @ApiOperation("告警统计") public AjaxResult statistics(AlarmQueryDTO queryDTO) { Map statistics = alarmService.getAlarmStatistics(queryDTO); return AjaxResult.success(statistics); } // @PreAuthorize("@ss.hasPermi('iot:alarm:export')") @Log(title = "告警", businessType = BusinessType.EXPORT) @PostMapping("/export") @ApiOperation("导出告警") public void export(HttpServletResponse response, AlarmQueryDTO queryDTO) { try { List list = alarmService.selectAlarmList(queryDTO); ExcelUtil util = new ExcelUtil<>(Alarm.class); util.exportExcel(response, list, "告警数据"); } catch (Exception e) { log.error("导出告警失败", e); } } } \ No newline at end of file +package com.maibu.controller; + + +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletResponse; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.maibu.annotation.Log; +import com.maibu.core.business.alarm_center.Alarm; +import com.maibu.core.business.dto.AlarmHandleDTO; +import com.maibu.core.business.dto.AlarmQueryDTO; +import com.maibu.core.controller.BaseController; +import com.maibu.core.domain.AjaxResult; +import com.maibu.core.page.TableDataInfo; +import com.maibu.enums.BusinessType; +import com.maibu.service.IAlarmService; +import com.maibu.utils.poi.ExcelUtil; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; + +@Api("告警中心接口") +@RestController +@Slf4j +@RequestMapping("/iot/alarm") +public class AlarmController extends BaseController{ + + + @Autowired + private IAlarmService alarmService; + + // @PreAuthorize("@ss.hasPermi('iot:alarm:list')") + @GetMapping("/list") + @ApiOperation("告警分页列表") + public TableDataInfo list(AlarmQueryDTO queryDTO) { +// startPage(); +// return alarmService.selectAlarmPage(queryDTO); + return alarmService.selectAlarmPage(queryDTO); + } + + // @PreAuthorize("@ss.hasPermi('iot:alarm:query')") + @GetMapping("/{id}") + @ApiOperation("获取告警详情") + public AjaxResult getInfo(@PathVariable Long id) { + return AjaxResult.success(alarmService.selectAlarmById(id)); + } + + // @PreAuthorize("@ss.hasPermi('iot:alarm:add')") + @Log(title = "告警", businessType = BusinessType.INSERT) + @PostMapping + @ApiOperation("新增告警") + public AjaxResult add(@RequestBody Alarm alarm) { + return toAjax(alarmService.insertAlarm(alarm)); + } + + // @PreAuthorize("@ss.hasPermi('iot:alarm:edit')") + @Log(title = "告警", businessType = BusinessType.UPDATE) + @PutMapping + @ApiOperation("修改告警") + public AjaxResult edit(@RequestBody Alarm alarm) { + return toAjax(alarmService.updateAlarm(alarm)); + } + + //@PreAuthorize("@ss.hasPermi('iot:alarm:handle')") + @Log(title = "告警处理", businessType = BusinessType.UPDATE) + @PutMapping("/handle") + @ApiOperation("处理告警") + public AjaxResult handle(@RequestBody AlarmHandleDTO handleDTO) { + return toAjax(alarmService.handleAlarm(handleDTO)); + } + + // @PreAuthorize("@ss.hasPermi('iot:alarm:remove')") + @Log(title = "告警", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + @ApiOperation("删除告警") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(alarmService.deleteAlarmByIds(ids)); + } + + // @PreAuthorize("@ss.hasPermi('iot:alarm:statistics')") +// @GetMapping("/statistics") +// @ApiOperation("告警统计") +// public AjaxResult statistics() { +// Map statistics = alarmService.getAlarmStatistics(); +// return AjaxResult.success(statistics); +// } + + + @GetMapping("/statistics") + @ApiOperation("告警统计") + public AjaxResult statistics(AlarmQueryDTO queryDTO) { + Map statistics = alarmService.getAlarmStatistics(queryDTO); + return AjaxResult.success(statistics); + } + + // @PreAuthorize("@ss.hasPermi('iot:alarm:export')") + @Log(title = "告警", businessType = BusinessType.EXPORT) + @PostMapping("/export") + @ApiOperation("导出告警") + public void export(HttpServletResponse response, AlarmQueryDTO queryDTO) { + try { + List list = alarmService.selectAlarmList(queryDTO); + ExcelUtil util = new ExcelUtil<>(Alarm.class); + util.exportExcel(response, list, "告警数据"); + } catch (Exception e) { + log.error("导出告警失败", e); + } + } + + + + +} diff --git a/maibu-service/maibu-iot-service/src/main/java/com/maibu/controller/DeviceRunParamController.java b/maibu-service/maibu-iot-service/src/main/java/com/maibu/controller/DeviceRunParamController.java new file mode 100644 index 0000000..f93103d --- /dev/null +++ b/maibu-service/maibu-iot-service/src/main/java/com/maibu/controller/DeviceRunParamController.java @@ -0,0 +1,49 @@ +package com.maibu.controller; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.maibu.core.business.DeviceRunParam; +import com.maibu.core.controller.BaseController; +import com.maibu.core.domain.AjaxResult; +import com.maibu.core.page.TableDataInfo; +import com.maibu.dto.DeviceRunParamQueryDTO; +import com.maibu.service.impl.DeviceRunParamService; + +@RestController +@RequestMapping("/iot/deviceRunParam") +public class DeviceRunParamController extends BaseController { + + @Autowired + private DeviceRunParamService service; + + @PostMapping("/save") + public AjaxResult save(@RequestBody DeviceRunParam deviceRunParam) { + + return AjaxResult.success(service.save(deviceRunParam)); + } + + @PostMapping("/list") + public TableDataInfo list(@RequestBody DeviceRunParamQueryDTO dto) { + startPage(); + return getDataTable(service.list(dto)); + } + + @GetMapping("/selectByDeviceId") + public AjaxResult selectByDeviceId(@RequestParam String deviceId) { + return AjaxResult.success(service.selectByDeviceId(deviceId)); + } + + @PostMapping("/delete") + public AjaxResult delete(@RequestBody List ids) { + return AjaxResult.success(service.delete(ids)); + } + +} diff --git a/maibu-service/maibu-iot-service/src/main/java/com/maibu/controller/ErrorIdentificationController.java b/maibu-service/maibu-iot-service/src/main/java/com/maibu/controller/ErrorIdentificationController.java new file mode 100644 index 0000000..e2bc45c --- /dev/null +++ b/maibu-service/maibu-iot-service/src/main/java/com/maibu/controller/ErrorIdentificationController.java @@ -0,0 +1,43 @@ +package com.maibu.controller; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.maibu.core.business.ErrorIdentificationStandard; +import com.maibu.core.controller.BaseController; +import com.maibu.core.domain.AjaxResult; +import com.maibu.core.page.TableDataInfo; +import com.maibu.dto.ErrorQueryDTO; +import com.maibu.service.impl.ErrorIdentificationService; + +@RestController +@RequestMapping("/iot/errorIdentification") +public class ErrorIdentificationController extends BaseController { + + @Autowired + private ErrorIdentificationService service; + + @PostMapping("/save") + public AjaxResult save(@RequestBody ErrorIdentificationStandard error) { + + return AjaxResult.success(service.save(error)); + } + + @PostMapping("/list") + public TableDataInfo list(@RequestBody ErrorQueryDTO dto) { + startPage(); + return getDataTable(service.list(dto)); + } + + @PostMapping("/delete") + public AjaxResult delete(@RequestBody List ids) { + return AjaxResult.success(service.delete(ids)); + } + +} diff --git a/maibu-service/maibu-iot-service/src/main/java/com/maibu/controller/IOTWorkOrderController.java b/maibu-service/maibu-iot-service/src/main/java/com/maibu/controller/IOTWorkOrderController.java index cc808b9..8a65d8f 100644 --- a/maibu-service/maibu-iot-service/src/main/java/com/maibu/controller/IOTWorkOrderController.java +++ b/maibu-service/maibu-iot-service/src/main/java/com/maibu/controller/IOTWorkOrderController.java @@ -1,5 +1,20 @@ package com.maibu.controller; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletResponse; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + import com.maibu.annotation.Log; import com.maibu.core.business.IOTWorkOrder; import com.maibu.core.business.dto.WorkOrderDispatchDTO; @@ -10,16 +25,10 @@ import com.maibu.core.page.TableDataInfo; import com.maibu.enums.BusinessType; import com.maibu.service.IWorkOrderService; import com.maibu.utils.poi.ExcelUtil; + import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import javax.servlet.http.HttpServletResponse; -import java.util.List; -import java.util.Map; @Api("工单任务接口") @RestController diff --git a/maibu-service/maibu-iot-service/src/main/java/com/maibu/controller/WorkRecordController.java b/maibu-service/maibu-iot-service/src/main/java/com/maibu/controller/WorkRecordController.java index 723fa29..659d347 100644 --- a/maibu-service/maibu-iot-service/src/main/java/com/maibu/controller/WorkRecordController.java +++ b/maibu-service/maibu-iot-service/src/main/java/com/maibu/controller/WorkRecordController.java @@ -1,20 +1,25 @@ package com.maibu.controller; +import java.io.InputStream; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + import com.maibu.core.business.WorkRecord; import com.maibu.core.business.path.LatAndLngEntity; import com.maibu.core.controller.BaseController; import com.maibu.core.domain.R; import com.maibu.service.impl.WorkRecordService; import com.maibu.utils.MinioUtil; -import com.maibu.utils.json.JsonUtils; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; -import org.springframework.http.MediaType; - -import java.io.InputStream; -import java.util.List; @RestController @RequestMapping("/iot/workRecord") diff --git a/maibu-service/maibu-iot-service/src/main/java/com/maibu/dto/DeviceRunParamQueryDTO.java b/maibu-service/maibu-iot-service/src/main/java/com/maibu/dto/DeviceRunParamQueryDTO.java new file mode 100644 index 0000000..aef3743 --- /dev/null +++ b/maibu-service/maibu-iot-service/src/main/java/com/maibu/dto/DeviceRunParamQueryDTO.java @@ -0,0 +1,11 @@ +package com.maibu.dto; + +import com.maibu.core.domain.BaseEntity; + +import lombok.Data; + +@Data +public class DeviceRunParamQueryDTO extends BaseEntity { + private Long siteId; + private String deviceId; +} diff --git a/maibu-service/maibu-iot-service/src/main/java/com/maibu/dto/ErrorQueryDTO.java b/maibu-service/maibu-iot-service/src/main/java/com/maibu/dto/ErrorQueryDTO.java new file mode 100644 index 0000000..5b837fd --- /dev/null +++ b/maibu-service/maibu-iot-service/src/main/java/com/maibu/dto/ErrorQueryDTO.java @@ -0,0 +1,15 @@ +package com.maibu.dto; + +import com.maibu.core.domain.BaseEntity; +import com.maibu.core.enums.ErrorLevel; +import com.maibu.core.enums.ErrorSource; + +import lombok.Data; + +@Data +public class ErrorQueryDTO extends BaseEntity { + private String errorName; + private ErrorSource errorSource; + private String errorCode; + private ErrorLevel errorLevel; +} diff --git a/maibu-service/maibu-iot-service/src/main/java/com/maibu/mapper/AlarmMapper.java b/maibu-service/maibu-iot-service/src/main/java/com/maibu/mapper/AlarmMapper.java index 6c7da6a..d5e55da 100644 --- a/maibu-service/maibu-iot-service/src/main/java/com/maibu/mapper/AlarmMapper.java +++ b/maibu-service/maibu-iot-service/src/main/java/com/maibu/mapper/AlarmMapper.java @@ -1 +1,11 @@ -package com.maibu.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.maibu.core.business.alarm_center.Alarm; import org.apache.ibatis.annotations.Mapper; @Mapper public interface AlarmMapper extends BaseMapper { } \ No newline at end of file +package com.maibu.mapper; + +import org.apache.ibatis.annotations.Mapper; + +import com.maibu.core.business.alarm_center.Alarm; +import com.maibu.mybatis.mapper.BaseMapperX; + +@Mapper +public interface AlarmMapper extends BaseMapperX { + +} diff --git a/maibu-service/maibu-iot-service/src/main/java/com/maibu/service/impl/AlarmServiceImpl.java b/maibu-service/maibu-iot-service/src/main/java/com/maibu/service/impl/AlarmServiceImpl.java index 8557e5b..1b57bfe 100644 --- a/maibu-service/maibu-iot-service/src/main/java/com/maibu/service/impl/AlarmServiceImpl.java +++ b/maibu-service/maibu-iot-service/src/main/java/com/maibu/service/impl/AlarmServiceImpl.java @@ -5,20 +5,31 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.maibu.core.business.Device; import com.maibu.core.business.alarm_center.Alarm; +import com.maibu.core.business.alarm_center.AlarmMessage; +import com.maibu.core.business.device.NettyDevice; import com.maibu.core.business.dto.AlarmHandleDTO; import com.maibu.core.business.dto.AlarmQueryDTO; import com.maibu.core.domain.model.LoginUser; +import com.maibu.core.enums.ErrorSource; import com.maibu.core.page.TableDataInfo; import com.maibu.exception.ServiceException; import com.maibu.mapper.AlarmMapper; import com.maibu.mapper.DeviceMapper; +import com.maibu.memory.GlobalMemory; +import com.maibu.mqtt.MqttTopic; import com.maibu.service.IAlarmService; import com.maibu.utils.SecurityUtils; import com.maibu.utils.StringUtils; +import com.maibu.utils.json.JsonUtils; + +import lombok.extern.slf4j.Slf4j; + +import org.eclipse.paho.client.mqttv3.MqttException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -26,9 +37,9 @@ import java.util.Map; import java.util.stream.Collectors; @Service +@Slf4j public class AlarmServiceImpl extends ServiceImpl implements IAlarmService { - @Autowired private DeviceMapper deviceMapper; @@ -55,7 +66,6 @@ public class AlarmServiceImpl extends ServiceImpl implements return baseMapper.selectList(wrapper); } - @Override public Map getAlarmStatistics(AlarmQueryDTO queryDTO) { com.github.pagehelper.PageHelper.clearPage(); @@ -69,14 +79,14 @@ public class AlarmServiceImpl extends ServiceImpl implements statistics.put("processing", alarms.stream().filter(a -> a.getHandleStatus() == 2).count()); statistics.put("closed", alarms.stream().filter(a -> a.getHandleStatus() == 3).count()); - statistics.put("levelStats", alarms.stream().collect(Collectors.groupingBy(Alarm::getAlarmLevel, Collectors.counting()))); - statistics.put("typeStats", alarms.stream().collect(Collectors.groupingBy(Alarm::getAlarmType, Collectors.counting()))); + statistics.put("levelStats", + alarms.stream().collect(Collectors.groupingBy(Alarm::getAlarmLevel, Collectors.counting()))); + statistics.put("typeStats", + alarms.stream().collect(Collectors.groupingBy(Alarm::getAlarmType, Collectors.counting()))); return statistics; } - - private void validateQueryParams(AlarmQueryDTO queryDTO) { Long userId = SecurityUtils.getUserId(); if (SecurityUtils.isAdmin(userId)) { @@ -93,10 +103,12 @@ public class AlarmServiceImpl extends ServiceImpl implements } private void validateSiteAccess(Long siteId) { - if (siteId == null) return; + if (siteId == null) + return; Long userId = SecurityUtils.getUserId(); - if (SecurityUtils.isAdmin(userId)) return; + if (SecurityUtils.isAdmin(userId)) + return; LoginUser loginUser = SecurityUtils.getLoginUser(); Long userSiteId = loginUser.getSiteId(); @@ -116,8 +128,7 @@ public class AlarmServiceImpl extends ServiceImpl implements Long count = deviceMapper.selectCount( new LambdaQueryWrapper() .eq(Device::getSiteId, siteId) - .eq(Device::getOrgId, userOrgId) - ); + .eq(Device::getOrgId, userOrgId)); if (count == 0) { // 如果查不到设备,说明要么场站无设备,要么场站不属于该组织 // 这里为了安全,默认拦截。如果允许查空场站,需改为校验 SysSite 表 @@ -128,17 +139,18 @@ public class AlarmServiceImpl extends ServiceImpl implements } } - private void validateDeviceAccess(Long deviceId) { - if (deviceId == null) return; + private void validateDeviceAccess(String deviceId) { + if (deviceId == null) + return; Long userId = SecurityUtils.getUserId(); - if (SecurityUtils.isAdmin(userId)) return; + if (SecurityUtils.isAdmin(userId)) + return; Device device = deviceMapper.selectOne( new LambdaQueryWrapper() .eq(Device::getDeviceId, deviceId) - .select(Device::getOrgId, Device::getSiteId) - ); + .select(Device::getOrgId, Device::getSiteId)); if (device == null) { throw new ServiceException("设备不存在"); @@ -175,9 +187,11 @@ public class AlarmServiceImpl extends ServiceImpl implements } wrapper.exists(sql, queryDTO.getSiteId()); } else if (userSiteId != null) { - wrapper.exists("SELECT 1 FROM iot_device d WHERE d.device_id = iot_alarm.device_id AND d.site_id = {0}", userSiteId); + wrapper.exists("SELECT 1 FROM iot_device d WHERE d.device_id = iot_alarm.device_id AND d.site_id = {0}", + userSiteId); } else if (userOrgId != null) { - wrapper.exists("SELECT 1 FROM iot_device d WHERE d.device_id = iot_alarm.device_id AND d.org_id = {0}", userOrgId); + wrapper.exists("SELECT 1 FROM iot_device d WHERE d.device_id = iot_alarm.device_id AND d.org_id = {0}", + userOrgId); } } @@ -196,12 +210,12 @@ public class AlarmServiceImpl extends ServiceImpl implements if (queryDTO.getHandleStatus() != null) { wrapper.eq(Alarm::getHandleStatus, queryDTO.getHandleStatus()); } -// if (queryDTO.getStartTime() != null) { -// wrapper.ge(Alarm::getAlarmTime, queryDTO.getStartTime()); -// } -// if (queryDTO.getEndTime() != null) { -// wrapper.le(Alarm::getAlarmTime, queryDTO.getEndTime()); -// } + // if (queryDTO.getStartTime() != null) { + // wrapper.ge(Alarm::getAlarmTime, queryDTO.getStartTime()); + // } + // if (queryDTO.getEndTime() != null) { + // wrapper.le(Alarm::getAlarmTime, queryDTO.getEndTime()); + // } if (queryDTO.getStartTime() != null) { wrapper.ge(Alarm::getAlarmTime, queryDTO.getStartTime()); @@ -222,7 +236,8 @@ public class AlarmServiceImpl extends ServiceImpl implements @Override public Alarm selectAlarmById(Long id) { Alarm alarm = baseMapper.selectById(id); - if (alarm == null) throw new ServiceException("告警不存在"); + if (alarm == null) + throw new ServiceException("告警不存在"); Long userId = SecurityUtils.getUserId(); if (!SecurityUtils.isAdmin(userId) && alarm.getDeviceId() != null) { @@ -258,7 +273,8 @@ public class AlarmServiceImpl extends ServiceImpl implements @Override public int handleAlarm(AlarmHandleDTO handleDTO) { Alarm alarm = baseMapper.selectById(handleDTO.getAlarmId()); - if (alarm == null) throw new ServiceException("告警不存在"); + if (alarm == null) + throw new ServiceException("告警不存在"); Long userId = SecurityUtils.getUserId(); if (!SecurityUtils.isAdmin(userId) && alarm.getDeviceId() != null) { @@ -307,7 +323,7 @@ public class AlarmServiceImpl extends ServiceImpl implements @Override public Map getAlarmStatistics() { - com.github.pagehelper.PageHelper.clearPage(); // 清除可能的分页参数 + com.github.pagehelper.PageHelper.clearPage(); // 清除可能的分页参数 Long userId = SecurityUtils.getUserId(); LoginUser loginUser = SecurityUtils.getLoginUser(); Long userOrgId = loginUser.getOrgId(); @@ -316,9 +332,11 @@ public class AlarmServiceImpl extends ServiceImpl implements LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); if (!SecurityUtils.isAdmin(userId)) { if (userSiteId != null) { - wrapper.exists("SELECT 1 FROM iot_device d WHERE d.device_id = iot_alarm.device_id AND d.site_id = {0}", userSiteId); + wrapper.exists("SELECT 1 FROM iot_device d WHERE d.device_id = iot_alarm.device_id AND d.site_id = {0}", + userSiteId); } else if (userOrgId != null) { - wrapper.exists("SELECT 1 FROM iot_device d WHERE d.device_id = iot_alarm.device_id AND d.org_id = {0}", userOrgId); + wrapper.exists("SELECT 1 FROM iot_device d WHERE d.device_id = iot_alarm.device_id AND d.org_id = {0}", + userOrgId); } } wrapper.ge(Alarm::getAlarmTime, LocalDateTime.now().minusDays(7)); @@ -330,9 +348,50 @@ public class AlarmServiceImpl extends ServiceImpl implements statistics.put("processing", alarms.stream().filter(a -> a.getHandleStatus() == 2).count()); statistics.put("closed", alarms.stream().filter(a -> a.getHandleStatus() == 3).count()); - statistics.put("levelStats", alarms.stream().collect(Collectors.groupingBy(Alarm::getAlarmLevel, Collectors.counting()))); - statistics.put("typeStats", alarms.stream().collect(Collectors.groupingBy(Alarm::getAlarmType, Collectors.counting()))); + statistics.put("levelStats", + alarms.stream().collect(Collectors.groupingBy(Alarm::getAlarmLevel, Collectors.counting()))); + statistics.put("typeStats", + alarms.stream().collect(Collectors.groupingBy(Alarm::getAlarmType, Collectors.counting()))); return statistics; } + + public void pushAlertMes(List alarmMessages) { + if (alarmMessages == null || alarmMessages.isEmpty()) { + return; + } + List list = new ArrayList<>(); + for (AlarmMessage alarmMessage : alarmMessages) { + Alarm alarm = new Alarm(); + alarm.setAlarmNo(alarmMessage.getNo()); + alarm.setAlarmLevel(alarmMessage.getLevel()); + alarm.setAlarmType(1); + alarm.setAlarmTitle(alarmMessage.getName()); + alarm.setAlarmContent(alarmMessage.getContent()); + alarm.setDeviceId(alarmMessage.getDeviceName()); + alarm.setDeviceName(alarmMessage.getDeviceName()); + alarm.setDeviceType(ErrorSource.MOWER); + alarm.setAlarmTime(LocalDateTime.now()); + pushErrorMessage(alarmMessage.getDeviceName(), JsonUtils.toJsonString(alarm)); + list.add(alarm); + } + baseMapper.insertBatch(list); + // todo 推送websocket? + } + + public void pushErrorMessage(String deviceId, String dto) { + try { + GlobalMemory.mqttClientUtil.publish(String.format(MqttTopic.DEVICE_ERROR_PUSH_TOPIC, deviceId), dto); + // List controlMasters = sessionManager.getAllSlaveControl(deviceId); + // if (!CollectionUtils.isEmpty(controlMasters)) { + // controlMasters.forEach(x -> { + // websocketMesDispather.dispather(x.getConnectorId(), dto); + // log.info("推送错误信息 device:{},content:{}", deviceId, dto); + // }); + // } + } catch (MqttException e) { + log.error("推送错误信息失败 device:{}error:{}", deviceId, e.getMessage()); + } + } + } diff --git a/maibu-service/maibu-iot-service/src/main/java/com/maibu/service/impl/DeviceRunParamService.java b/maibu-service/maibu-iot-service/src/main/java/com/maibu/service/impl/DeviceRunParamService.java new file mode 100644 index 0000000..d5a9be7 --- /dev/null +++ b/maibu-service/maibu-iot-service/src/main/java/com/maibu/service/impl/DeviceRunParamService.java @@ -0,0 +1,67 @@ +package com.maibu.service.impl; + +import java.util.Collection; +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.maibu.core.business.DeviceRunParam; +import com.maibu.dto.DeviceRunParamQueryDTO; +import com.maibu.mapper.DeviceRunParamMapper; +import com.maibu.memory.GlobalMemory; +import com.maibu.memory.SiteMemory; + +@Service +public class DeviceRunParamService { + + @Autowired + private DeviceRunParamMapper deviceRunParamMapper; + + public boolean save(DeviceRunParam deviceRunParam) { + SiteMemory siteMemory = GlobalMemory.getSiteMemory(deviceRunParam.getOrgId(), deviceRunParam.getSiteId()); + if (siteMemory != null) { + siteMemory.saveDeviceRunParam(deviceRunParam); + } + return deviceRunParamMapper.saveOrUpdate(deviceRunParam); + } + + public List list(DeviceRunParamQueryDTO dto) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if (dto != null) { + if (dto.getSiteId() != null) { + queryWrapper.eq(DeviceRunParam::getSiteId, dto.getSiteId()); + } + if (StringUtils.isEmpty(dto.getDeviceId())) { + queryWrapper.eq(DeviceRunParam::getDeviceId, dto.getDeviceId()); + } + } + return deviceRunParamMapper.selectList(queryWrapper); + } + + public DeviceRunParam selectByDeviceId(String deviceId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if (!StringUtils.isEmpty(deviceId)) { + queryWrapper.eq(DeviceRunParam::getDeviceId, deviceId); + } + return deviceRunParamMapper.selectOne(queryWrapper); + } + + public int delete(List ids) { + List deviceRunParams = deviceRunParamMapper.selectBatchIds(ids); + if (!CollectionUtils.isEmpty(deviceRunParams)) { + deviceRunParams.forEach(x -> { + SiteMemory siteMemory = GlobalMemory.getSiteMemory(x.getOrgId(), x.getSiteId()); + if (siteMemory != null) { + siteMemory.removeDeviceRunParam(x.getDeviceId()); + } + }); + } + int i = deviceRunParamMapper.deleteBatchIds(ids); + return i; + } + +} diff --git a/maibu-service/maibu-iot-service/src/main/java/com/maibu/service/impl/ErrorIdentificationService.java b/maibu-service/maibu-iot-service/src/main/java/com/maibu/service/impl/ErrorIdentificationService.java new file mode 100644 index 0000000..05bef23 --- /dev/null +++ b/maibu-service/maibu-iot-service/src/main/java/com/maibu/service/impl/ErrorIdentificationService.java @@ -0,0 +1,48 @@ +package com.maibu.service.impl; + +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.maibu.core.business.ErrorIdentificationStandard; +import com.maibu.dto.ErrorQueryDTO; +import com.maibu.mapper.ErrorIdentificationStandardMapper; + +@Service +public class ErrorIdentificationService { + + @Autowired + private ErrorIdentificationStandardMapper errorIdentificationStandardMapper; + + public boolean save(ErrorIdentificationStandard errorIdentificationStandard) { + return errorIdentificationStandardMapper.saveOrUpdate(errorIdentificationStandard); + } + + public List list(ErrorQueryDTO dto) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if (dto != null) { + if (!StringUtils.isEmpty(dto.getErrorCode())) { + queryWrapper.eq(ErrorIdentificationStandard::getErrorCode, dto.getErrorCode()); + } + if (!StringUtils.isEmpty(dto.getErrorName())) { + queryWrapper.like(ErrorIdentificationStandard::getErrorName, dto.getErrorName()); + } + if (dto.getErrorLevel() != null) { + queryWrapper.eq(ErrorIdentificationStandard::getErrorLevel, dto.getErrorLevel()); + } + if (dto.getErrorSource() != null) { + queryWrapper.eq(ErrorIdentificationStandard::getErrorSource, dto.getErrorSource()); + } + } + return errorIdentificationStandardMapper.selectList(queryWrapper); + } + + public int delete(List ids) { + int i = errorIdentificationStandardMapper.deleteBatchIds(ids); + return i; + } + +} diff --git a/maibu-service/maibu-iot-service/src/main/java/com/maibu/service/impl/WorkOrderServiceImpl.java b/maibu-service/maibu-iot-service/src/main/java/com/maibu/service/impl/WorkOrderServiceImpl.java index 236bac5..aab2037 100644 --- a/maibu-service/maibu-iot-service/src/main/java/com/maibu/service/impl/WorkOrderServiceImpl.java +++ b/maibu-service/maibu-iot-service/src/main/java/com/maibu/service/impl/WorkOrderServiceImpl.java @@ -8,6 +8,7 @@ import com.maibu.core.business.IOTWorkOrder; import com.maibu.core.business.dto.WorkOrderDispatchDTO; import com.maibu.core.business.dto.WorkOrderQueryDTO; import com.maibu.core.domain.model.LoginUser; +import com.maibu.core.enums.ErrorLevel; import com.maibu.core.page.TableDataInfo; import com.maibu.exception.ServiceException; import com.maibu.mapper.DeviceMapper; @@ -451,7 +452,7 @@ public class WorkOrderServiceImpl extends ServiceImpl w.getCreateTime().toLocalDate().equals(LocalDateTime.now().toLocalDate())) .count()); - statistics.put("highPriority", workOrders.stream().filter(w -> w.getPriorityLevel() == 1).count()); + statistics.put("highPriority", workOrders.stream().filter(w -> w.getPriorityLevel().equals(ErrorLevel.ERROR)).count()); return statistics; } @@ -483,7 +484,7 @@ public class WorkOrderServiceImpl extends ServiceImpl list(SysSite site) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); if (site != null && !StringUtils.isEmpty(site.getSiteName())) { queryWrapper.like(SysSite::getSiteName, site.getSiteName()); } - if (site != null && site.getOrgId()!=null) { + if (site != null && site.getOrgId() != null) { queryWrapper.eq(SysSite::getOrgId, site.getOrgId()); } queryWrapper.orderByAsc(SysSite::getOrgId); return sysSiteMapper.selectList(queryWrapper); } - public boolean save(SysSite org) { - return sysSiteMapper.saveOrUpdate(org); + public boolean save(SysSite site) { + boolean b = sysSiteMapper.saveOrUpdate(site); + SiteMemory siteMemory = GlobalMemory.getSiteMemory(site.getOrgId(), site.getId()); + if (siteMemory != null) { + siteMemory.setSysSite(site); + } + return b; } @Transactional @@ -46,7 +52,6 @@ public class SysSiteService { return sysSiteMapper.deleteBatchIds(ids); } - public boolean checkExistSite(Long id) { List sysSites = selectByOrgId(id); if (CollectionUtils.isEmpty(sysSites)) { diff --git a/maibu-web-middleware/src/main/java/com/maibu/netty/handler/ClientHandler.java b/maibu-web-middleware/src/main/java/com/maibu/netty/handler/ClientHandler.java index 2a80e47..f882565 100644 --- a/maibu-web-middleware/src/main/java/com/maibu/netty/handler/ClientHandler.java +++ b/maibu-web-middleware/src/main/java/com/maibu/netty/handler/ClientHandler.java @@ -1,34 +1,42 @@ package com.maibu.netty.handler; -import cn.hutool.json.JSONObject; -import com.maibu.common.MiddleCommandConstant; -import com.maibu.common.MiddleConstant; -import com.maibu.core.business.device.DeviceStatusDetail; -import com.maibu.core.business.inter.WebsocketMesDispather; -import com.maibu.core.business.path.LatAndLngEntity; -import com.maibu.core.enums.MesType; -import com.maibu.core.enums.RespondCode; -import com.maibu.dto.*; -import com.maibu.memory.MiddleGlobalMemory; -import com.maibu.netty.NettyClient; -import com.maibu.utils.HttpService; -import com.maibu.utils.json.JsonUtils; -import com.maibu.utils.spring.SpringUtils; -import com.maibu.websocket.WebsocketHandler; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.java_websocket.WebSocket; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; +import org.apache.commons.lang3.StringUtils; +import org.java_websocket.WebSocket; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.maibu.common.MiddleCommandConstant; +import com.maibu.common.MiddleConstant; +import com.maibu.core.business.device.DeviceStatusDetail; +import com.maibu.core.business.inter.WebsocketMesDispather; +import com.maibu.core.business.path.LatAndLngEntity; +import com.maibu.core.enums.MesType; +import com.maibu.dto.DeviceRespondDTO; +import com.maibu.dto.NettySwitchDeviceDTO; +import com.maibu.dto.ResultDTO; +import com.maibu.dto.WebAuthResponseDTO; +import com.maibu.dto.WebDeviceTaskStatusMessageDTO; +import com.maibu.dto.WebOlineStatusMessageDTO; +import com.maibu.dto.WebStatusMessageDTO; +import com.maibu.dto.WebSwitchControlResponseDTO; +import com.maibu.memory.MiddleGlobalMemory; +import com.maibu.netty.NettyClient; +import com.maibu.utils.HttpService; +import com.maibu.utils.json.JsonUtils; +import com.maibu.utils.spring.SpringUtils; +import com.maibu.websocket.WebsocketHandler; + +import cn.hutool.json.JSONObject; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import lombok.extern.slf4j.Slf4j; + /** * Netty客户端处理器 */