Просмотр исходного кода

保存设备告警后同步创建案件和工单

xiang13487 4 дней назад
Родитель
Сommit
6edb179ea4

+ 133 - 0
zk-api-service/src/main/java/com/zksy/api/domain/CaseInfo.java

@@ -0,0 +1,133 @@
+package com.zksy.api.domain;
+
+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 io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 案件信息表
+ * @TableName case_info
+ */
+@TableName(value ="case_info")
+@Data
+@ApiModel(value = "案件信息入参", description = "案件信息入参")
+public class CaseInfo implements Serializable {
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 案件ID
+     */
+    @ApiModelProperty(value = "案件ID")
+    @TableId(type = IdType.AUTO)
+    private Long caseId;
+
+    /**
+     * 案件编号
+     */
+    @ApiModelProperty(value = "案件编号")
+    private String caseNo;
+
+    /**
+     * 关联报警ID,手动立案可为空
+     */
+    @ApiModelProperty(value = "报警ID")
+    private String alarmId;
+
+    /**
+     * 关联设备ID
+     */
+    @ApiModelProperty(value = "设备ID")
+    private String deviceId;
+
+    /**
+     * 设备编码
+     */
+    @ApiModelProperty(value = "设备编码")
+    private String deviceCode;
+
+    /**
+     * 案件等级:1-严重 2-一般 3-轻微
+     */
+    @ApiModelProperty(value = "案件等级:1-严重 2-一般 3-轻微")
+    private Integer caseLevel;
+
+    /**
+     * 案件描述
+     */
+    @ApiModelProperty(value = "案件描述")
+    private String caseDesc;
+
+    /**
+     * 案件来源:1-系统自动报警 2-运维巡检上报 3-人工投诉上报 4-平台录入
+     */
+    @ApiModelProperty(value = "案件来源:1-系统自动报警 2-运维巡检上报 3-人工投诉上报 4-平台录入")
+    private Integer caseSource;
+
+    /**
+     * 案件状态:1-待核查 2-办理中 3-已办结 4-误报关闭
+     */
+    @ApiModelProperty(value = "案件状态:1-待核查 2-办理中 3-已办结 4-误报关闭")
+    private Integer caseStatus;
+
+    /**
+     * 立案人ID
+     */
+    @ApiModelProperty(value = "立案人ID")
+    private Long fileUser;
+
+    /**
+     * 核查人ID
+     */
+    @ApiModelProperty(value = "核查人ID")
+    private Long verifyUser;
+
+    /**
+     * 核查完成时间
+     */
+    @ApiModelProperty(value = "核查完成时间")
+    @JsonFormat(locale = "zh",pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date verifyTime;
+
+    /**
+     * 案件办结时间
+     */
+    @ApiModelProperty(value = "案件办结时间")
+    @JsonFormat(locale = "zh",pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date finishTime;
+
+    /**
+     * 案件处置结果、整改说明
+     */
+    @ApiModelProperty(value = "案件处置结果")
+    private String handleResult;
+
+    /**
+     * 案件佐证图片、附件地址
+     */
+    @ApiModelProperty(value = "案件佐证图片、附件地址")
+    private String attachUrl;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间")
+    @JsonFormat(locale = "zh",pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(value = "更新时间")
+    @JsonFormat(locale = "zh",pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date updateTime;
+}

+ 89 - 0
zk-api-service/src/main/java/com/zksy/api/domain/EquipmentBase.java

@@ -0,0 +1,89 @@
+package com.zksy.api.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * 设备基础信息表
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("equipment_base")
+public class EquipmentBase {
+
+    @TableId(value = "equipment_id", type = IdType.ASSIGN_UUID)
+    @ApiModelProperty("设备唯一ID(主键)")
+    private String equipmentId;
+
+    @ApiModelProperty("设备编码(唯一标识)")
+    private String equipmentCode;
+
+    @ApiModelProperty("设备名称")
+    private String equipmentName;
+
+    @ApiModelProperty("设备型号")
+    private String equipmentModel;
+
+    @ApiModelProperty("设备规格参数")
+    private String equipmentSpec;
+
+    @ApiModelProperty("设备制造商")
+    private String manufacturer;
+
+    @ApiModelProperty("设备生产日期")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date productionDate;
+
+    @ApiModelProperty("设备类别ID(关联equipment_type表)")
+    private String equipmentTypeId;
+
+    @ApiModelProperty("设备资产价值(元)")
+    private Double assetValue;
+
+    @ApiModelProperty("预计使用年限(年)")
+    private Integer useLife;
+
+    @ApiModelProperty("设备经度")
+    private BigDecimal longitude;
+
+    @ApiModelProperty("设备纬度")
+    private BigDecimal latitude;
+
+    @ApiModelProperty("设备位置描述")
+    private String equipmentLocation;
+
+    @ApiModelProperty("安装时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime installTime;
+
+    @ApiModelProperty("设备负责人")
+    private String maintainer;
+
+    @ApiModelProperty("联系方式")
+    private String maintainerPhone;
+
+    @ApiModelProperty("权属单位")
+    private String ownershipUnit;
+
+    @ApiModelProperty("备注信息")
+    private String remark;
+
+    @ApiModelProperty("创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("更新时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime updateTime;
+}

+ 178 - 0
zk-api-service/src/main/java/com/zksy/api/domain/WorkOrder.java

@@ -0,0 +1,178 @@
+package com.zksy.api.domain;
+
+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 io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 运维工单表
+ * @TableName work_order
+ */
+@TableName(value ="work_order")
+@Data
+@ApiModel(value = "运维工单入参", description = "运维工单入参")
+public class WorkOrder implements Serializable {
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 工单ID
+     */
+    @ApiModelProperty(value = "工单ID")
+    @TableId(type = IdType.AUTO)
+    private Long orderId;
+
+    /**
+     * 工单编号
+     */
+    @ApiModelProperty(value = "工单编号")
+    private String orderNo;
+
+    /**
+     * 关联报警ID
+     */
+    @ApiModelProperty(value = "报警ID")
+    private String alarmId;
+
+    /**
+     * 关联案件ID
+     */
+    @ApiModelProperty(value = "案件ID")
+    private Long caseId;
+
+    /**
+     * 案件编号
+     */
+    @ApiModelProperty(value = "案件编号")
+    private String caseNo;
+
+    /**
+     * 关联设备ID
+     */
+    @ApiModelProperty(value = "设备ID")
+    private String deviceId;
+
+    /**
+     * 设备编码
+     */
+    @ApiModelProperty(value = "设备编码")
+    private String deviceCode;
+
+    /**
+     * 工单类型:1-故障维修 2-日常巡检 3-设备保养
+     */
+    @ApiModelProperty(value = "工单类型:1-故障维修 2-日常巡检 3-设备保养")
+    private Integer orderType;
+
+    /**
+     * 工单优先级:1-紧急 2-一般 3-低
+     */
+    @ApiModelProperty(value = "工单优先级:1-紧急 2-一般 3-低")
+    private Integer orderLevel;
+
+    /**
+     * 工单问题描述
+     */
+    @ApiModelProperty(value = "工单问题描述")
+    private String orderDesc;
+
+    /**
+     * 负责部门ID
+     */
+    @ApiModelProperty(value = "负责部门ID")
+    private Long deptId;
+
+    /**
+     * 派单人ID
+     */
+    @ApiModelProperty(value = "派单人ID")
+    private Long dispatchUser;
+
+    /**
+     * 派单时间
+     */
+    @ApiModelProperty(value = "派单时间")
+    @JsonFormat(locale = "zh",pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date dispatchTime;
+
+    /**
+     * 接单运维人员ID
+     */
+    @ApiModelProperty(value = "接单运维人员ID")
+    private Long receiveUser;
+
+    /**
+     * 工单状态:1-待派单 2-待接单 3-已接单 4-处理中 5-待验收 6-已结案 7-已驳回 8-延期审核 9-已延期
+     */
+    @ApiModelProperty(value = "工单状态:1-待派单 2-待接单 3-已接单 4-处理中 5-待验收 6-已结案 7-已驳回 8-延期审核 9-已延期")
+    private Integer orderStatus;
+
+    /**
+     * 延期原因
+     */
+    @ApiModelProperty(value = "延期原因")
+    private String delayedReason;
+
+    /**
+     * 延期截止时间
+     */
+    @ApiModelProperty(value = "延期截止时间")
+    @JsonFormat(locale = "zh",pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date delayedDeadline;
+
+    /**
+     * 计划完成时间
+     */
+    @ApiModelProperty(value = "计划完成时间")
+    @JsonFormat(locale = "zh",pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date planFinishTime;
+
+    /**
+     * 实际完成时间
+     */
+    @ApiModelProperty(value = "实际完成时间")
+    @JsonFormat(locale = "zh",pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date realFinishTime;
+
+    /**
+     * 维修处置结果
+     */
+    @ApiModelProperty(value = "维修处置结果")
+    private String repairResult;
+
+    /**
+     * 验收人ID
+     */
+    @ApiModelProperty(value = "验收人ID")
+    private Long verifyUser;
+
+    /**
+     * 验收时间
+     */
+    @ApiModelProperty(value = "验收时间")
+    @JsonFormat(locale = "zh",pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date verifyTime;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间")
+    @JsonFormat(locale = "zh",pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(value = "更新时间")
+    @JsonFormat(locale = "zh",pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date updateTime;
+}

+ 70 - 0
zk-api-service/src/main/java/com/zksy/api/domain/WorkOrderLog.java

@@ -0,0 +1,70 @@
+package com.zksy.api.domain;
+
+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 io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 工单操作日志表
+ * @TableName work_order_log
+ */
+@TableName(value ="work_order_log")
+@Data
+@ApiModel(value = "工单操作日志入参", description = "工单操作日志入参")
+public class WorkOrderLog implements Serializable {
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 日志ID
+     */
+    @ApiModelProperty(value = "日志ID")
+    @TableId(type = IdType.AUTO)
+    private Long logId;
+
+    /**
+     * 关联工单ID
+     */
+    @ApiModelProperty(value = "工单ID")
+    private Long orderId;
+
+    /**
+     * 操作类型:1-创建工单 2-派单 3-接单 4-开始维修 5-提交验收 6-验收通过 7-驳回工单 8-申请延期
+     */
+    @ApiModelProperty(value = "操作类型:1-创建工单 2-派单 3-接单 4-开始维修 5-提交验收 6-验收通过 7-驳回工单 8-申请延期 9-延期审核通过")
+    private Integer operType;
+
+    /**
+     * 操作详情描述
+     */
+    @ApiModelProperty(value = "操作详情描述")
+    private String operDesc;
+
+    /**
+     * 操作人ID
+     */
+    @ApiModelProperty(value = "操作人ID")
+    private Long operUserId;
+
+    /**
+     * 操作人姓名
+     */
+    @ApiModelProperty(value = "操作人姓名")
+    private String operUserName;
+
+    /**
+     * 操作时间
+     */
+    @ApiModelProperty(value = "操作时间")
+    @JsonFormat(locale = "zh",pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private Date operTime;
+}

+ 8 - 0
zk-api-service/src/main/java/com/zksy/api/mapper/CaseInfoMapper.java

@@ -0,0 +1,8 @@
+package com.zksy.api.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zksy.api.domain.CaseInfo;
+
+public interface CaseInfoMapper extends BaseMapper<CaseInfo> {
+
+}

+ 8 - 0
zk-api-service/src/main/java/com/zksy/api/mapper/EquipmentBaseMapper.java

@@ -0,0 +1,8 @@
+package com.zksy.api.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zksy.api.domain.EquipmentBase;
+
+public interface EquipmentBaseMapper extends BaseMapper<EquipmentBase> {
+
+}

+ 8 - 0
zk-api-service/src/main/java/com/zksy/api/mapper/WorkOrderLogMapper.java

@@ -0,0 +1,8 @@
+package com.zksy.api.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zksy.api.domain.WorkOrderLog;
+
+public interface WorkOrderLogMapper extends BaseMapper<WorkOrderLog> {
+
+}

+ 8 - 0
zk-api-service/src/main/java/com/zksy/api/mapper/WorkOrderMapper.java

@@ -0,0 +1,8 @@
+package com.zksy.api.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zksy.api.domain.WorkOrder;
+
+public interface WorkOrderMapper extends BaseMapper<WorkOrder> {
+
+}

+ 127 - 5
zk-api-service/src/main/java/com/zksy/api/service/impl/AlarmDataServiceImpl.java

@@ -1,19 +1,42 @@
 package com.zksy.api.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.zksy.api.domain.AlarmData;
-import com.zksy.api.mapper.AlarmDataMapper;
+import com.zksy.api.domain.*;
+import com.zksy.api.mapper.*;
 import com.zksy.api.service.AlarmDataService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Arrays;
 import java.util.List;
+import java.util.Random;
 
+@Slf4j
 @Service
-public class AlarmDataServiceImpl extends ServiceImpl<AlarmDataMapper, AlarmData> 
+public class AlarmDataServiceImpl extends ServiceImpl<AlarmDataMapper, AlarmData>
     implements AlarmDataService {
+
+    @Autowired
+    private EquipmentBaseMapper equipmentBaseMapper;
+
+    @Autowired
+    private CaseInfoMapper caseInfoMapper;
+
+    @Autowired
+    private WorkOrderMapper workOrderMapper;
+
+    @Autowired
+    private WorkOrderLogMapper workOrderLogMapper;
+
+    /**
+     * 需要同步新增案件的设备类别ID
+     */
+    private static final List<String> CASE_REQUIRED_TYPE_IDS = Arrays.asList("5", "9", "10");
+
     @Override
     public boolean saveAlarmData(AlarmData alarmData) {
         if (alarmData.getAlarmTime() == null) {
@@ -25,6 +48,105 @@ public class AlarmDataServiceImpl extends ServiceImpl<AlarmDataMapper, AlarmData
         if (alarmData.getAlarmStatus() == null) {
             alarmData.setAlarmStatus(0);
         }
-        return this.save(alarmData);
+        boolean saved = this.save(alarmData);
+        if (saved) {
+            try {
+                syncCreateCaseAndWorkOrder(alarmData);
+            } catch (Exception e) {
+                log.error("保存告警后同步创建案件/工单失败,alarmId={}", alarmData.getId(), e);
+            }
+        }
+        return saved;
+    }
+
+    /**
+     * 根据设备类别ID同步创建案件和工单
+     * 1、设备类别ID为5、9、10时:同步新增案件信息 + 新增工单
+     * 2、设备类别ID不为5、9、10时:仅新增工单
+     */
+    private void syncCreateCaseAndWorkOrder(AlarmData alarmData) {
+        log.info("保存设备告警后同步创建案件和工单-入参:{}", alarmData);
+        // 根据设备编码查询设备基础信息
+        EquipmentBase equipmentBase = equipmentBaseMapper.selectOne(
+                new LambdaQueryWrapper<EquipmentBase>()
+                        .eq(EquipmentBase::getEquipmentCode, alarmData.getDeviceCode())
+                        .last("LIMIT 1"));
+        if (equipmentBase == null) {
+            log.warn("未找到设备编码对应的设备信息,deviceCode={}", alarmData.getDeviceCode());
+            return;
+        }
+
+        String typeId = equipmentBase.getEquipmentTypeId();
+        boolean needCreateCase = CASE_REQUIRED_TYPE_IDS.contains(typeId);
+
+        // 告警等级映射为案件等级/工单优先级:1级->1-紧急, 2级->1-紧急, 3级->2-一般, 4级->3-低
+        int caseLevel = alarmData.getAlarmLevel() != null ? alarmData.getAlarmLevel() : 4;
+        int orderLevel = caseLevel <= 2 ? 1 : (caseLevel == 3 ? 2 : 3);
+
+        // 构建告警描述
+        String desc = alarmData.getWarningType() != null ? alarmData.getWarningType() : "设备告警";
+        if (alarmData.getRemark() != null) {
+            desc += "-" + alarmData.getRemark();
+        }
+
+        CaseInfo caseInfo = null;
+        if (needCreateCase) {
+            // 同步新增案件信息
+            caseInfo = new CaseInfo();
+            caseInfo.setCaseNo(generateCaseNo());
+            caseInfo.setAlarmId(alarmData.getId());
+            caseInfo.setDeviceId(equipmentBase.getEquipmentId());
+            caseInfo.setDeviceCode(alarmData.getDeviceCode());
+            caseInfo.setCaseLevel(caseLevel);
+            caseInfo.setCaseDesc(desc);
+            caseInfo.setCaseSource(1); // 1-系统自动报警
+            caseInfo.setCaseStatus(1); // 1-待核查
+            caseInfoMapper.insert(caseInfo);
+            log.info("同步新增案件信息成功,caseNo={}, alarmId={}", caseInfo.getCaseNo(), alarmData.getId());
+        }
+
+        // 同步新增工单
+        WorkOrder workOrder = new WorkOrder();
+        workOrder.setOrderNo(generateOrderNo());
+        workOrder.setAlarmId(alarmData.getId());
+        workOrder.setDeviceId(equipmentBase.getEquipmentId());
+        workOrder.setDeviceCode(alarmData.getDeviceCode());
+        workOrder.setOrderType(1); // 1-故障维修
+        workOrder.setOrderLevel(orderLevel);
+        workOrder.setOrderDesc(desc);
+        workOrder.setOrderStatus(1); // 1-待派单
+        if (caseInfo != null) {
+            workOrder.setCaseId(caseInfo.getCaseId());
+            workOrder.setCaseNo(caseInfo.getCaseNo());
+        }
+        workOrderMapper.insert(workOrder);
+        log.info("同步新增工单成功,orderNo={}, alarmId={}", workOrder.getOrderNo(), alarmData.getId());
+
+        // 新增工单操作日志
+        WorkOrderLog workOrderLog = new WorkOrderLog();
+        workOrderLog.setOrderId(workOrder.getOrderId());
+        workOrderLog.setOperType(1); // 1-创建工单
+        workOrderLog.setOperDesc(desc + ",系统告警自动创建工单");
+        workOrderLog.setOperUserName("系统");
+        workOrderLogMapper.insert(workOrderLog);
+        log.info("同步新增工单操作日志成功,orderId={}, alarmId={}", workOrder.getOrderId(), alarmData.getId());
+    }
+
+    /**
+     * 生成案件编号:CS + 年月日时分秒 + 4位随机数
+     */
+    private static String generateCaseNo() {
+        String currentDateTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
+        String randomNum = String.format("%04d", new Random().nextInt(10000));
+        return "CS" + currentDateTime + randomNum;
+    }
+
+    /**
+     * 生成工单编号:WO + 年月日时分秒 + 4位随机数
+     */
+    private static String generateOrderNo() {
+        String currentDateTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
+        String randomNum = String.format("%04d", new Random().nextInt(10000));
+        return "WO" + currentDateTime + randomNum;
     }
 }