LAPTOP-JI2IUVG1\26646 пре 1 месец
родитељ
комит
7485f1aa86

+ 106 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/ops/service/impl/WorkOrderServiceImpl.java

@@ -7,6 +7,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zksy.base.domain.EquipmentBase;
 import com.zksy.base.domain.EquipmentType;
 import com.zksy.base.domain.HazardHiddenAccount;
+import com.zksy.base.alarm.domain.AlarmData;
+import com.zksy.base.alarm.service.AlarmDataService;
 import com.zksy.ops.domain.WorkOrder;
 import com.zksy.ops.domain.WorkOrderLog;
 import com.zksy.ops.domain.vo.WorkOrderLogVO;
@@ -48,6 +50,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -119,6 +122,9 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
     @Autowired
     private HazardHiddenAccountMapper hazardHiddenAccountMapper;
 
+    @Autowired
+    private AlarmDataService alarmDataService;
+
     @Autowired
     private ISysUserService sysUserService;
 
@@ -283,6 +289,79 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
         return workOrder.getOrderId();
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Long createWorkOrderFromAlarm(String alarmId, Integer orderLevel, String orderDesc) {
+        if (StringUtils.isEmpty(alarmId)) {
+            throw new ServiceException("报警ID不能为空");
+        }
+
+        AlarmData alarm = alarmDataService.getById(alarmId);
+        if (alarm == null) {
+            throw new ServiceException("报警信息不存在");
+        }
+
+        // 报警转工单必须幂等:重复点击直接返回已有工单,不重复生成工单。
+        WorkOrder existing = this.lambdaQuery()
+                .eq(WorkOrder::getAlarmId, alarmId)
+                .orderByDesc(WorkOrder::getOrderId)
+                .last("LIMIT 1")
+                .one();
+        if (existing != null) {
+            if (!Objects.equals(alarm.getAlarmStatus(), 1)) {
+                LocalDateTime now = LocalDateTime.now();
+                alarm.setAlarmStatus(1);
+                alarm.setHandleTime(now);
+                alarm.setHandleUser(currentUserName());
+                alarm.setHandleRemark("已关联工单:" + existing.getOrderNo());
+                alarm.setUpdateTime(now);
+                alarmDataService.updateById(alarm);
+            }
+            return existing.getOrderId();
+        }
+
+        EquipmentBase equipment = null;
+        if (StringUtils.isNotEmpty(alarm.getDeviceCode())) {
+            equipment = equipmentBaseMapper.selectOne(new LambdaQueryWrapper<EquipmentBase>()
+                    .eq(EquipmentBase::getEquipmentCode, alarm.getDeviceCode())
+                    .last("LIMIT 1"));
+        }
+        String deviceId = equipment == null ? alarm.getDeviceCode() : equipment.getEquipmentId();
+        checkDeviceOrderConflict(deviceId);
+
+        Date now = new Date();
+        WorkOrder workOrder = new WorkOrder();
+        workOrder.setAlarmId(alarmId);
+        workOrder.setOrderNo(generateOrderNo());
+        workOrder.setDeviceId(deviceId);
+        workOrder.setDeviceCode(alarm.getDeviceCode());
+        workOrder.setOrderLevel(orderLevel == null
+                ? mapAlarmLevelToOrderLevel(alarm.getAlarmLevel()).getCode()
+                : WorkOrderLevelEnum.getByCode(orderLevel).getCode());
+        workOrder.setOrderDesc(StringUtils.isNotEmpty(orderDesc) ? orderDesc : buildAlarmOrderDesc(alarm));
+        workOrder.setFaultTime(alarm.getAlarmTime() == null
+                ? now
+                : java.sql.Timestamp.valueOf(alarm.getAlarmTime()));
+        workOrder.setDeptId(assignScopeSupport.currentDeptId());
+        workOrder.setOrderStatus(WorkOrderStatusEnum.PENDING_DISPATCH.getCode());
+        workOrder.setDelayApplyStatus(WorkOrderDelayApplyStatusEnum.NONE.getCode());
+        workOrder.setCreateTime(now);
+        workOrder.setUpdateTime(now);
+        this.save(workOrder);
+
+        writeLog(workOrder.getOrderId(), WorkOrderLogOperTypeEnum.CREATE,
+                buildDesc("由报警[" + alarmId + "]创建工单", workOrder.getOrderDesc()), null);
+
+        LocalDateTime alarmUpdateTime = LocalDateTime.now();
+        alarm.setAlarmStatus(1);
+        alarm.setHandleTime(alarmUpdateTime);
+        alarm.setHandleUser(currentUserName());
+        alarm.setHandleRemark("已派发工单:" + workOrder.getOrderNo());
+        alarm.setUpdateTime(alarmUpdateTime);
+        alarmDataService.updateById(alarm);
+        return workOrder.getOrderId();
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Long createWorkOrderFromHazard(String hazardId, String hazardNo, String hazardDesc, String equipmentId, String hazardLevel, String hazardImages, Date planFinishTime) {
@@ -736,6 +815,33 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
         return WorkOrderLevelEnum.NORMAL;
     }
 
+    /** 报警等级映射工单优先级:1级最高为紧急,4级最低为低,其余为一般。 */
+    private WorkOrderLevelEnum mapAlarmLevelToOrderLevel(Integer alarmLevel) {
+        if (alarmLevel == null || alarmLevel == 1) {
+            return WorkOrderLevelEnum.URGENT;
+        }
+        if (alarmLevel == 4) {
+            return WorkOrderLevelEnum.LOW;
+        }
+        return WorkOrderLevelEnum.NORMAL;
+    }
+
+    /** 生成报警转工单时的默认问题描述。 */
+    private String buildAlarmOrderDesc(AlarmData alarm) {
+        StringBuilder sb = new StringBuilder();
+        sb.append(StringUtils.isEmpty(alarm.getWarningType()) ? "监测报警" : alarm.getWarningType());
+        sb.append(",当前值:").append(alarm.getActualValue() == null ? "-" : alarm.getActualValue().toPlainString());
+        if (alarm.getMinValue() != null || alarm.getMaxValue() != null) {
+            sb.append("(阈值:")
+                    .append(alarm.getMinValue() == null ? "-" : alarm.getMinValue().toPlainString())
+                    .append("~")
+                    .append(alarm.getMaxValue() == null ? "-" : alarm.getMaxValue().toPlainString())
+                    .append(")");
+        }
+        sb.append(",请现场核实处理");
+        return sb.toString();
+    }
+
     private String resolveDeviceCode(String deviceId) {
         try {
             EquipmentBase equipment = equipmentBaseMapper.selectById(deviceId);