This commit is contained in:
2026-07-14 12:43:23 +08:00
parent 8f7a35e3c7
commit 29ecbf321f
52 changed files with 1197 additions and 324 deletions

View File

@@ -0,0 +1,29 @@
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.OrgNoUserDO;
import com.maibu.core.enums.ErrorSource;
import lombok.Data;
import lombok.EqualsAndHashCode;
//记录配置告警是否需要自动生成工单
@Data
@EqualsAndHashCode(callSuper = true)
@TableName(value = "iot_alarm_order_config", autoResultMap = true)
public class AlarmOrderConfig extends OrgNoUserDO {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.AUTO)
private Long id;
private String ErrorCode;
private ErrorSource sourceType;
private boolean autoGenerateOrder = false;
private Long modelId; // 工单模型
}

View File

@@ -3,6 +3,7 @@ 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.OrgBaseDO;
import com.maibu.core.enums.CompareEnum;
import com.maibu.core.enums.ErrorLevel;
import com.maibu.core.enums.ErrorSource;
@@ -10,8 +11,8 @@ import lombok.Data;
@Data
@TableName("error_identification")
public class ErrorIdentificationStandard {
@TableName("iot_error_identification")
public class ErrorIdentificationStandard extends OrgBaseDO {
@TableId(type = IdType.AUTO)
private Long id;
private String field;

View File

@@ -1,23 +1,26 @@
package com.maibu.core.business;
import com.baomidou.mybatisplus.annotation.*;
import com.maibu.core.domain.TenantBaseDO;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.maibu.core.domain.OrgNoUserDO;
import com.maibu.core.enums.ErrorLevel;
import com.maibu.core.enums.ErrorSource;
import com.maibu.core.enums.OrderType;
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 {
public class IOTWorkOrder extends OrgNoUserDO {
@ApiModelProperty("主键 ID")
@TableId(type = IdType.AUTO)
@@ -32,10 +35,8 @@ public class IOTWorkOrder extends TenantBaseDO {
@ApiModelProperty("工单来源:1-AI 诊断 2-无人机巡检 3-清洗优化 4-视频监控 5-装备控制 6-人工创建 7-告警关联")
private Integer sourceType;
@ApiModelProperty("工单类型:1-巡检 2-检修 3-清洗 4-维修 5-运维")
private Integer orderType;
private OrderType orderType;
@ApiModelProperty("优先级:1-高 2-中 3-低")
private ErrorLevel priorityLevel;
@ApiModelProperty("关联设备 ID")
@@ -45,17 +46,11 @@ public class IOTWorkOrder extends TenantBaseDO {
private String deviceName;
@ApiModelProperty("设备类型")
private ErrorSource deviceType;
@ApiModelProperty("关联场站 ID")
private Long siteId;
private ErrorSource deviceType;
@ApiModelProperty("关联场站名称")
private String siteName;
@ApiModelProperty("关联组织 ID")
private Long orgId;
@ApiModelProperty("负责人 ID")
private Long assigneeId;
@@ -109,4 +104,8 @@ public class IOTWorkOrder extends TenantBaseDO {
@ApiModelProperty("处理备注")
private String handleRemark;
private Long modelId;
private Long taskId;
}

View File

@@ -0,0 +1,40 @@
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.OrgNoUserDO;
import com.maibu.core.enums.ErrorLevel;
import com.maibu.core.enums.OrderType;
import lombok.Data;
import lombok.EqualsAndHashCode;
//自动生成工单配置的模型
@Data
@EqualsAndHashCode(callSuper = true)
@TableName(value = "iot_order_model", autoResultMap = true)
public class OrderModel extends OrgNoUserDO {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.AUTO)
private Long id;
private String orderName; // 工单名称 这个需要拼上时间
private OrderType orderType;
private ErrorLevel errorLevel;
private boolean autoGenerateTask = false; // 是否自动生成任务
private String deviceId; // 设备Id
private Long routeId; // 路径规划Id
private String waylineId; // 航线ID
private Integer rthAltitude; // 返航高度
private String rthMode; // 返航模式 optimal 智能高度 preset 设定高度
}

View File

@@ -107,4 +107,8 @@ public class Alarm extends TenantBaseDO {
@ApiModelProperty("是否邮件通知:0-否 1-是")
@Excel(name = "邮件通知", readConverterExp = "0=否,1=是")
private Integer notifyEmail;
private Long siteId;
private Long orgId;
}

View File

@@ -40,4 +40,9 @@ public class AlarmMessage {
/** 状态 */
private String status;
private Long siteId;
private Long orgId;
}

View File

@@ -55,6 +55,9 @@ public class NettyDevice extends Connector {
// todo 注册的时候更新 siteId
private Device device;
//todo 假如设置一个当前控制的token
private String currentControlToken;
@JsonIgnore
private DevicePlanTaskMapper devicePlanTaskMapper = SpringUtils.getBean(DevicePlanTaskMapper.class);

View File

@@ -5,6 +5,9 @@ import java.time.LocalDateTime;
import org.springframework.format.annotation.DateTimeFormat;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.maibu.core.domain.BaseEntity;
import com.maibu.core.enums.ErrorLevel;
import com.maibu.core.enums.ErrorSource;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -12,25 +15,14 @@ import lombok.Data;
@Data
@ApiModel("告警查询参数")
public class AlarmQueryDTO {
public class AlarmQueryDTO extends BaseEntity {
@ApiModelProperty("页码")
private Integer pageNum = 1;
@ApiModelProperty("告警编号")
private String alarmNo;
@ApiModelProperty("每页条数")
private Integer pageSize = 10;
private ErrorSource deviceType;
@ApiModelProperty("告警级别:1-严重 2-重要 3-一般 4-提示")
private Integer alarmLevel;
@ApiModelProperty("告警类型")
private Integer alarmType;
@ApiModelProperty("设备类型")
private Integer deviceType;
@ApiModelProperty("处理状态:1-待处理 2-处理中 3-已关闭 4-已忽略")
private Integer handleStatus;
private ErrorLevel alarmLevel;
@ApiModelProperty("开始时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -42,9 +34,6 @@ public class AlarmQueryDTO {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime endTime;
@ApiModelProperty("搜索关键词(告警编号/内容)")
private String keyword;
@ApiModelProperty("设备ID")
private String deviceId;

View File

@@ -0,0 +1,23 @@
package com.maibu.core.business.dto;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class DeviceTaskCommandDTO {
private String deviceId;
private Long routeId; // 线路id
private LocalDateTime startTime; //开始时间 时分秒
private Long orgId;
private Long siteId;
private Long taskId;
}

View File

@@ -6,6 +6,10 @@ import lombok.Data;
import java.time.LocalDateTime;
import javax.lang.model.type.ErrorType;
import com.maibu.core.enums.OrderType;
@Data
@ApiModel("工单查询参数")
public class WorkOrderQueryDTO {
@@ -20,10 +24,10 @@ public class WorkOrderQueryDTO {
private Integer sourceType;
@ApiModelProperty("工单类型")
private Integer orderType;
private OrderType orderType;
@ApiModelProperty("优先级")
private Integer priorityLevel;
private ErrorType priorityLevel;
@ApiModelProperty("负责人 ID")
private Long assigneeId;

View File

@@ -0,0 +1,20 @@
package com.maibu.core.business.dto;
import java.time.LocalDateTime;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
@Data
public class WorkOrderStartDTO {
private List<Long> ids;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime startTime;
private String deviceId;
}

View File

@@ -0,0 +1,16 @@
package com.maibu.core.business.dto.uav;
import lombok.Data;
@Data
public class FlightTaskCreateDTO {
private String name;
private String sn;
private String wayline_uuid;
private String time_zone;
private Integer rth_altitude;
private String rth_mode;
private String wayline_precision_type;
private String resumable_status;
private String task_type;
}

View File

@@ -0,0 +1,26 @@
package com.maibu.core.business.inter.mower;
import java.util.Map;
import javax.annotation.Resource;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import com.maibu.core.business.dto.DeviceTaskCommandDTO;
@Component
public class MowerCommandDispather {
@Resource
private ApplicationContext applicationContext;
public void dispathDeviceTask(DeviceTaskCommandDTO dto) {
Map<String, MowerCommandInter> beanMap = applicationContext.getBeansOfType(MowerCommandInter.class);
// 遍历
beanMap.values().forEach(x -> {
x.createDeviceTask(dto);
});
}
}

View File

@@ -0,0 +1,9 @@
package com.maibu.core.business.inter.mower;
import com.maibu.core.business.dto.DeviceTaskCommandDTO;
public interface MowerCommandInter {
void createDeviceTask(DeviceTaskCommandDTO dto);
}

View File

@@ -0,0 +1,26 @@
package com.maibu.core.business.inter.uav;
import java.util.Map;
import javax.annotation.Resource;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import com.maibu.core.business.dto.uav.FlightTaskCreateDTO;
@Component
public class UAVCommandDispather {
@Resource
private ApplicationContext applicationContext;
public void dispathFightTask(FlightTaskCreateDTO dto) {
Map<String, UAVCommandInter> beanMap = applicationContext.getBeansOfType(UAVCommandInter.class);
// 遍历
beanMap.values().forEach(x -> {
x.createFlightTask(dto);
});
}
}

View File

@@ -0,0 +1,9 @@
package com.maibu.core.business.inter.uav;
import com.maibu.core.business.dto.uav.FlightTaskCreateDTO;
public interface UAVCommandInter {
void createFlightTask(FlightTaskCreateDTO dto);
}

View File

@@ -0,0 +1,22 @@
package com.maibu.core.domain;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 拓展多租户的 BaseDO 基类
*
* @author fastbee
*/
@Data
@EqualsAndHashCode(callSuper = true)
public abstract class OrgNoUserDO extends BaseDO {
/**
* 多租户编号
*/
private Long orgId;
private Long siteId;
}

View File

@@ -0,0 +1,33 @@
package com.maibu.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum OrderType {
MOWER_ERROR("MOWER_ERROR", "割草机故障", 1),
UAV_ERROR("UAV_ERROR", "无人机故障", 2),
INSPECTION_TASK("INSPECTION_TASK", "巡检", 2),
COMPONENT_DEFECT("COMPONENT_DEFECT", "光伏组件故障", 3),
CLEAN_TASK("CLEAN_TASK", "清洗任务", 2),
MAINTAIN_TASK("MAINTAIN_TASK", "维护任务", 3),
REPAIR_TASK("REPAIR_TASK", "维修任务", 3),
OTHER("OTHER", "其他", 3);
/** 订单类型值(存储在数据库中) */
private final String value;
/** 订单类型名称(用于前端显示) */
private final String name;
// 主体 1-割草机 2 -无人机 3 -其他
private final Integer type;
}

View File

@@ -0,0 +1,14 @@
package com.maibu.mapper;
import org.springframework.stereotype.Repository;
import com.maibu.core.business.AlarmOrderConfig;
import com.maibu.mybatis.mapper.BaseMapperX;
/**
* 设备历史状态
*/
@Repository
public interface AlarmOrderConfigMapper extends BaseMapperX<AlarmOrderConfig> {
}

View File

@@ -0,0 +1,14 @@
package com.maibu.mapper;
import org.springframework.stereotype.Repository;
import com.maibu.core.business.OrderModel;
import com.maibu.mybatis.mapper.BaseMapperX;
/**
* 设备历史状态
*/
@Repository
public interface OrderModelMapper extends BaseMapperX<OrderModel> {
}

View File

@@ -10,12 +10,14 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import com.maibu.core.business.AlarmOrderConfig;
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.business.OrderModel;
import com.maibu.core.domain.entity.SysSite;
import com.maibu.core.enums.ErrorSource;
@@ -27,12 +29,16 @@ import lombok.extern.slf4j.Slf4j;
@Slf4j
public class SiteMemory {
public Map<ErrorSource, List<ErrorIdentificationStandard>> standards = null;
public ConcurrentHashMap<ErrorSource, List<ErrorIdentificationStandard>> standards = null;
public Long siteId;
public SysSite sysSite;
public static final ConcurrentHashMap<Long, OrderModel> ordrModelMap = new ConcurrentHashMap<>();
public static final ConcurrentHashMap<String, AlarmOrderConfig> orderConfigMap = new ConcurrentHashMap<>();
public static final ConcurrentHashMap<String, DeviceRunParam> deviceRunParamMap = new ConcurrentHashMap<>();
private static final ConcurrentHashMap<String, Device> deviceMap = new ConcurrentHashMap<>();
@@ -73,6 +79,68 @@ public class SiteMemory {
}
}
public void saveErrorIdentificationStandard(ErrorIdentificationStandard errorIdentificationStandard) {
if (standards == null) {
standards = new ConcurrentHashMap<>();
}
List<ErrorIdentificationStandard> list = standards.get(errorIdentificationStandard.getErrorSource());
if (CollectionUtils.isEmpty(list)) {
list = new ArrayList<>();
}
list.add(errorIdentificationStandard);
standards.put(errorIdentificationStandard.getErrorSource(), list);
}
public List<ErrorIdentificationStandard> getErrorIdentificationStandard(ErrorSource errorSource) {
if (errorSource != null && standards != null) {
return standards.get(errorSource);
}
return null;
}
public void removeErrorIdentificationStandard(ErrorIdentificationStandard errorIdentificationStandard) {
if (errorIdentificationStandard != null && standards != null) {
List<ErrorIdentificationStandard> list = standards.get(errorIdentificationStandard.getErrorSource());
if (!CollectionUtils.isEmpty(list)) {
list.removeIf(x -> x.getId().equals(errorIdentificationStandard.getId()));
}
}
}
public void saveOrderModel(OrderModel orderModel) {
ordrModelMap.put(orderModel.getId(), orderModel);
}
public OrderModel getOrderModel(Long id) {
if (id != null) {
return ordrModelMap.get(id);
}
return null;
}
public void removeOrderModel(Long id) {
if (id != null) {
ordrModelMap.remove(id);
}
}
public void saveAlarmOrderConfig(AlarmOrderConfig alarmOrderConfig) {
orderConfigMap.put(alarmOrderConfig.getErrorCode(), alarmOrderConfig);
}
public AlarmOrderConfig getAlarmOrderConfig(String errorCode) {
if (!StringUtils.isEmpty(errorCode)) {
return orderConfigMap.get(errorCode);
}
return null;
}
public void removeAlarmOrderConfig(String errorCode) {
if (!StringUtils.isEmpty(errorCode)) {
orderConfigMap.remove(errorCode);
}
}
public void addDevicePlan(DevicePlan devicePlan) {
if (devicePlan != null && !StringUtils.isEmpty(devicePlan.getDeviceId())) {
String deviceId = devicePlan.getDeviceId();

View File

@@ -1,6 +1,5 @@
package com.maibu.mqtt;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
@@ -83,11 +82,14 @@ public class MqttClientUtil {
int qos)
throws MqttException {
MqttMessage message =
new MqttMessage(payload.getBytes());
MqttMessage message = new MqttMessage(payload.getBytes());
message.setQos(qos);
if (!client.isConnected()) {
log.warn("MQTT未连接");
return;
}
client.publish(topic, message);
}