|
|
@@ -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);
|