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

feat:应急指挥-模拟演练接入报警与工单

null 3 дней назад
Родитель
Сommit
86f0dda155

+ 87 - 16
pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/gasbasic/DrillSimulationController.java

@@ -1,6 +1,7 @@
 package com.zksy.web.controller.gasbasic;
 package com.zksy.web.controller.gasbasic;
 
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zksy.base.service.DrillSimulationService;
 import com.zksy.base.domain.*;
 import com.zksy.base.domain.*;
 import com.zksy.base.mapper.*;
 import com.zksy.base.mapper.*;
 import com.zksy.common.annotation.Anonymous;
 import com.zksy.common.annotation.Anonymous;
@@ -29,6 +30,8 @@ public class DrillSimulationController {
     private DrillSimulationLogMapper logMapper;
     private DrillSimulationLogMapper logMapper;
     @Autowired
     @Autowired
     private DrillSimulationResultMapper resultMapper;
     private DrillSimulationResultMapper resultMapper;
+    @Autowired
+    private DrillSimulationService drillSimulationService;
 
 
     @GetMapping("/project")
     @GetMapping("/project")
     @Anonymous
     @Anonymous
@@ -50,25 +53,86 @@ public class DrillSimulationController {
         return AjaxResult.success();
         return AjaxResult.success();
     }
     }
 
 
-    @GetMapping("/scene/{projectId}") @Anonymous
-    public AjaxResult scene(@PathVariable Long projectId) { return AjaxResult.success(sceneMapper.selectList(new LambdaQueryWrapper<DrillSimulationScene>().eq(DrillSimulationScene::getProjectId, projectId))); }
-    @PostMapping("/scene") @Anonymous public AjaxResult saveScene(@RequestBody DrillSimulationScene s) { if (s.getId() != null) sceneMapper.updateById(s); else sceneMapper.insert(s); return AjaxResult.success(); }
-    @DeleteMapping("/scene/{id}") @Anonymous public AjaxResult deleteScene(@PathVariable Long id) { sceneMapper.deleteById(id); return AjaxResult.success(); }
+    @GetMapping("/scene/{projectId}")
+    @Anonymous
+    public AjaxResult scene(@PathVariable Long projectId) {
+        return AjaxResult.success(sceneMapper.selectList(new LambdaQueryWrapper<DrillSimulationScene>().eq(DrillSimulationScene::getProjectId, projectId)));
+    }
+
+    @PostMapping("/scene")
+    @Anonymous
+    public AjaxResult saveScene(@RequestBody DrillSimulationScene s) {
+        if (s.getId() != null) sceneMapper.updateById(s);
+        else sceneMapper.insert(s);
+        return AjaxResult.success();
+    }
+
+    @DeleteMapping("/scene/{id}")
+    @Anonymous
+    public AjaxResult deleteScene(@PathVariable Long id) {
+        sceneMapper.deleteById(id);
+        return AjaxResult.success();
+    }
+
+    @GetMapping("/event/{projectId}")
+    @Anonymous
+    public AjaxResult event(@PathVariable Long projectId) {
+        return AjaxResult.success(eventMapper.selectList(new LambdaQueryWrapper<DrillSimulationEvent>().eq(DrillSimulationEvent::getProjectId, projectId)));
+    }
+
+    @PostMapping("/event")
+    @Anonymous
+    public AjaxResult saveEvent(@RequestBody DrillSimulationEvent e) {
+        eventMapper.insert(e);
+        return AjaxResult.success();
+    }
+
+    @DeleteMapping("/event/{id}")
+    @Anonymous
+    public AjaxResult deleteEvent(@PathVariable Long id) {
+        eventMapper.deleteById(id);
+        return AjaxResult.success();
+    }
+
+    @GetMapping("/role/{projectId}")
+    @Anonymous
+    public AjaxResult role(@PathVariable Long projectId) {
+        return AjaxResult.success(roleMapper.selectList(new LambdaQueryWrapper<DrillSimulationRole>().eq(DrillSimulationRole::getProjectId, projectId)));
+    }
+
+    @PostMapping("/role")
+    @Anonymous
+    public AjaxResult saveRole(@RequestBody DrillSimulationRole r) {
+        roleMapper.insert(r);
+        return AjaxResult.success();
+    }
+
+    @DeleteMapping("/role/{id}")
+    @Anonymous
+    public AjaxResult deleteRole(@PathVariable Long id) {
+        roleMapper.deleteById(id);
+        return AjaxResult.success();
+    }
 
 
-    @GetMapping("/event/{projectId}") @Anonymous
-    public AjaxResult event(@PathVariable Long projectId) { return AjaxResult.success(eventMapper.selectList(new LambdaQueryWrapper<DrillSimulationEvent>().eq(DrillSimulationEvent::getProjectId, projectId))); }
-    @PostMapping("/event") @Anonymous public AjaxResult saveEvent(@RequestBody DrillSimulationEvent e) { eventMapper.insert(e); return AjaxResult.success(); }
-    @DeleteMapping("/event/{id}") @Anonymous public AjaxResult deleteEvent(@PathVariable Long id) { eventMapper.deleteById(id); return AjaxResult.success(); }
+    @GetMapping("/task/{projectId}")
+    @Anonymous
+    public AjaxResult task(@PathVariable Long projectId) {
+        return AjaxResult.success(taskMapper.selectList(new LambdaQueryWrapper<DrillSimulationTask>().eq(DrillSimulationTask::getProjectId, projectId)));
+    }
 
 
-    @GetMapping("/role/{projectId}") @Anonymous
-    public AjaxResult role(@PathVariable Long projectId) { return AjaxResult.success(roleMapper.selectList(new LambdaQueryWrapper<DrillSimulationRole>().eq(DrillSimulationRole::getProjectId, projectId))); }
-    @PostMapping("/role") @Anonymous public AjaxResult saveRole(@RequestBody DrillSimulationRole r) { roleMapper.insert(r); return AjaxResult.success(); }
-    @DeleteMapping("/role/{id}") @Anonymous public AjaxResult deleteRole(@PathVariable Long id) { roleMapper.deleteById(id); return AjaxResult.success(); }
+    @PostMapping("/task")
+    @Anonymous
+    public AjaxResult saveTask(@RequestBody DrillSimulationTask t) {
+        taskMapper.insert(t);
+        return AjaxResult.success();
+    }
 
 
-    @GetMapping("/task/{projectId}") @Anonymous
-    public AjaxResult task(@PathVariable Long projectId) { return AjaxResult.success(taskMapper.selectList(new LambdaQueryWrapper<DrillSimulationTask>().eq(DrillSimulationTask::getProjectId, projectId))); }
-    @PostMapping("/task") @Anonymous public AjaxResult saveTask(@RequestBody DrillSimulationTask t) { taskMapper.insert(t); return AjaxResult.success(); }
-    @DeleteMapping("/task/{id}") @Anonymous public AjaxResult deleteTask(@PathVariable Long id) { taskMapper.deleteById(id); return AjaxResult.success(); }
+    @DeleteMapping("/task/{id}")
+    @Anonymous
+    public AjaxResult deleteTask(@PathVariable Long id) {
+        taskMapper.deleteById(id);
+        return AjaxResult.success();
+    }
 
 
     @GetMapping("/log/{projectId}")
     @GetMapping("/log/{projectId}")
     @Anonymous
     @Anonymous
@@ -88,4 +152,11 @@ public class DrillSimulationController {
     public AjaxResult result(@PathVariable Long projectId) {
     public AjaxResult result(@PathVariable Long projectId) {
         return AjaxResult.success(resultMapper.selectOne(new LambdaQueryWrapper<DrillSimulationResult>().eq(DrillSimulationResult::getProjectId, projectId)));
         return AjaxResult.success(resultMapper.selectOne(new LambdaQueryWrapper<DrillSimulationResult>().eq(DrillSimulationResult::getProjectId, projectId)));
     }
     }
+
+    @PostMapping("/process")
+    @Anonymous
+    @ApiOperation("根据项目类型批量触发设备告警")
+    public AjaxResult process(@RequestParam Long projectId, @RequestParam String action, @RequestParam String category) {
+        return AjaxResult.success(drillSimulationService.triggerAlarm(category));
+    }
 }
 }

+ 4 - 4
pipe-network-service/zksy-system/src/main/java/com/zksy/base/alarm/service/impl/AlarmDataServiceImpl.java

@@ -23,8 +23,8 @@ public class AlarmDataServiceImpl extends ServiceImpl<AlarmDataMapper, AlarmData
     private EquipmentBaseMapper equipmentBaseMapper;
     private EquipmentBaseMapper equipmentBaseMapper;
 
 
     @Override
     @Override
-    public Page<AlarmData> findByPage(long pageNum, long pageSize, String deviceCode, 
-                                        String warningType, String warningCode, 
+    public Page<AlarmData> findByPage(long pageNum, long pageSize, String deviceCode,
+                                        String warningType, String warningCode,
                                         Integer alarmStatus, String equipmentType) {
                                         Integer alarmStatus, String equipmentType) {
         Page<AlarmData> page = new Page<>(pageNum, pageSize);
         Page<AlarmData> page = new Page<>(pageNum, pageSize);
         LambdaQueryWrapper<AlarmData> queryWrapper = new LambdaQueryWrapper<>();
         LambdaQueryWrapper<AlarmData> queryWrapper = new LambdaQueryWrapper<>();
@@ -106,8 +106,8 @@ public class AlarmDataServiceImpl extends ServiceImpl<AlarmDataMapper, AlarmData
     }
     }
 
 
     @Override
     @Override
-    public List<AlarmData> getAlarmDataList(String deviceCode, 
-                                              String warningType, String warningCode, 
+    public List<AlarmData> getAlarmDataList(String deviceCode,
+                                              String warningType, String warningCode,
                                               Integer alarmStatus) {
                                               Integer alarmStatus) {
         LambdaQueryWrapper<AlarmData> queryWrapper = new LambdaQueryWrapper<>();
         LambdaQueryWrapper<AlarmData> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.like(deviceCode != null, AlarmData::getDeviceCode, deviceCode)
         queryWrapper.like(deviceCode != null, AlarmData::getDeviceCode, deviceCode)

+ 105 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/DrillAlarmSyncService.java

@@ -0,0 +1,105 @@
+package com.zksy.base.service;
+
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zksy.base.alarm.domain.AlarmData;
+import com.zksy.base.domain.CaseInfo;
+import com.zksy.base.domain.EquipmentBase;
+import com.zksy.base.domain.WorkOrder;
+import com.zksy.base.domain.WorkOrderLog;
+import com.zksy.base.mapper.CaseInfoMapper;
+import com.zksy.base.mapper.EquipmentBaseMapper;
+import com.zksy.base.mapper.WorkOrderLogMapper;
+import com.zksy.base.mapper.WorkOrderMapper;
+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 DrillAlarmSyncService {
+
+    @Autowired
+    private EquipmentBaseMapper equipmentBaseMapper;
+    @Autowired
+    private CaseInfoMapper caseInfoMapper;
+    @Autowired
+    private WorkOrderMapper workOrderMapper;
+    @Autowired
+    private WorkOrderLogMapper workOrderLogMapper;
+
+    private static final List<String> CASE_REQUIRED_TYPE_IDS = Arrays.asList("5", "9", "10");
+
+    public void syncCreateCaseAndWorkOrder(AlarmData 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);
+        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);
+            caseInfo.setCaseStatus(1);
+            caseInfoMapper.insert(caseInfo);
+            log.info("同步新增案件信息成功,caseNo={}", caseInfo.getCaseNo());
+        }
+        WorkOrder workOrder = new WorkOrder();
+        workOrder.setOrderNo(generateOrderNo());
+        workOrder.setAlarmId(alarmData.getId());
+        workOrder.setDeviceId(equipmentBase.getEquipmentId());
+        workOrder.setDeviceCode(alarmData.getDeviceCode());
+        workOrder.setOrderType(1);
+        workOrder.setOrderLevel(orderLevel);
+        workOrder.setOrderDesc(desc);
+        workOrder.setOrderStatus(1);
+        if (caseInfo != null) {
+            workOrder.setCaseId(caseInfo.getCaseId());
+            workOrder.setCaseNo(caseInfo.getCaseNo());
+        }
+        workOrderMapper.insert(workOrder);
+        log.info("同步新增工单成功,orderNo={}", workOrder.getOrderNo());
+        WorkOrderLog workOrderLog = new WorkOrderLog();
+        workOrderLog.setOrderId(workOrder.getOrderId());
+        workOrderLog.setOperType(1);
+        workOrderLog.setOperDesc(desc + ",系统告警自动创建工单");
+        workOrderLog.setOperUserName("系统");
+        workOrderLog.setOperUserId(-1L);
+        workOrderLog.setOperTime(DateUtil.date());
+        workOrderLogMapper.insert(workOrderLog);
+        log.info("同步新增工单操作日志成功,orderId={}", workOrder.getOrderId());
+    }
+
+    private static String generateCaseNo() {
+        String dt = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
+        return "CS" + dt + String.format("%04d", new Random().nextInt(10000));
+    }
+
+    private static String generateOrderNo() {
+        String dt = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
+        return "WO" + dt + String.format("%04d", new Random().nextInt(10000));
+    }
+}

+ 8 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/DrillSimulationService.java

@@ -0,0 +1,8 @@
+package com.zksy.base.service;
+
+import java.util.Map;
+
+public interface DrillSimulationService {
+
+    Map<String, Object> triggerAlarm(String category);
+}

+ 103 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/service/impl/DrillSimulationServiceImpl.java

@@ -0,0 +1,103 @@
+package com.zksy.base.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zksy.base.alarm.domain.AlarmData;
+import com.zksy.base.alarm.service.AlarmDataService;
+import com.zksy.base.service.DrillAlarmSyncService;
+import com.zksy.base.service.DrillSimulationService;
+import com.zksy.base.domain.EquipmentBase;
+import com.zksy.base.domain.EquipmentType;
+import com.zksy.base.mapper.EquipmentBaseMapper;
+import com.zksy.base.mapper.EquipmentTypeMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+public class DrillSimulationServiceImpl implements DrillSimulationService {
+
+    @Autowired
+    private EquipmentTypeMapper equipmentTypeMapper;
+    @Autowired
+    private EquipmentBaseMapper equipmentBaseMapper;
+    @Autowired
+    private AlarmDataService alarmDataService;
+    @Autowired
+    private DrillAlarmSyncService drillAlarmSyncService;
+
+    @Override
+    public Map<String, Object> triggerAlarm(String category) {
+        EquipmentType topType = equipmentTypeMapper.selectOne(
+                new LambdaQueryWrapper<EquipmentType>()
+                        .eq(EquipmentType::getTypeName, category)
+                        .eq(EquipmentType::getParentTypeId, "0"));
+        if (topType == null) {
+            throw new IllegalArgumentException("未找到项目类型对应的设备分类:" + category);
+        }
+        List<String> typeIds = new ArrayList<>();
+        typeIds.add(topType.getId());
+        collectChildTypeIds(topType.getId(), typeIds);
+
+        List<EquipmentBase> equipments = equipmentBaseMapper.selectList(
+                new LambdaQueryWrapper<EquipmentBase>()
+                        .in(EquipmentBase::getEquipmentTypeId, typeIds));
+        if (CollUtil.isEmpty(equipments)) {
+            throw new IllegalArgumentException("未找到" + category + "类型下的设备");
+        }
+        Map<String, String> typeNameMap = equipmentTypeMapper.selectBatchIds(typeIds).stream()
+                .collect(Collectors.toMap(EquipmentType::getId, EquipmentType::getTypeName, (a, b) -> a));
+
+        int successCount = 0, failCount = 0;
+        LocalDateTime now = LocalDateTime.now();
+        for (EquipmentBase eq : equipments) {
+            try {
+                AlarmData alarm = new AlarmData();
+                alarm.setDeviceCode(eq.getEquipmentCode());
+                alarm.setWarningType(typeNameMap.getOrDefault(eq.getEquipmentTypeId(), "未知类型") + "模拟告警");
+                alarm.setWarningCode("DRILL-" + System.currentTimeMillis());
+                alarm.setMinValue(new BigDecimal("0"));
+                alarm.setMaxValue(new BigDecimal("100"));
+                alarm.setActualValue(new BigDecimal("150"));
+                alarm.setAlarmLevel(1);
+                alarm.setAlarmStatus(0);
+                alarm.setAlarmTime(now);
+                alarm.setDeviationRatio(new BigDecimal("50"));
+                alarm.setRemark("演练模拟告警-" + category);
+                alarm.setCreateTime(now);
+                boolean saved = alarmDataService.saveAlarmData(alarm);
+                if (saved) {
+                    drillAlarmSyncService.syncCreateCaseAndWorkOrder(alarm);
+                    successCount++;
+                } else {
+                    failCount++;
+                }
+            } catch (Exception e) {
+                log.error("模拟告警失败, equipmentId={}", eq.getEquipmentId(), e);
+                failCount++;
+            }
+        }
+        Map<String, Object> result = new LinkedHashMap<>();
+        result.put("category", category);
+        result.put("total", equipments.size());
+        result.put("success", successCount);
+        result.put("fail", failCount);
+        return result;
+    }
+
+    private void collectChildTypeIds(String parentId, List<String> typeIds) {
+        List<EquipmentType> children = equipmentTypeMapper.selectList(
+                new LambdaQueryWrapper<EquipmentType>()
+                        .eq(EquipmentType::getParentTypeId, parentId));
+        for (EquipmentType child : children) {
+            typeIds.add(child.getId());
+            collectChildTypeIds(child.getId(), typeIds);
+        }
+    }
+}