|
|
|
@ -15,6 +15,7 @@ |
|
|
|
*/ |
|
|
|
package org.thingsboard.server.service.entitiy.alarm; |
|
|
|
|
|
|
|
import com.fasterxml.jackson.databind.node.ObjectNode; |
|
|
|
import lombok.AllArgsConstructor; |
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
@ -38,6 +39,9 @@ import org.thingsboard.server.common.data.id.AlarmId; |
|
|
|
import org.thingsboard.server.common.data.id.EntityId; |
|
|
|
import org.thingsboard.server.common.data.id.TenantId; |
|
|
|
import org.thingsboard.server.common.data.id.UserId; |
|
|
|
import org.thingsboard.server.common.data.page.PageData; |
|
|
|
import org.thingsboard.server.common.data.page.PageLink; |
|
|
|
import org.thingsboard.server.common.data.page.SortOrder; |
|
|
|
import org.thingsboard.server.dao.eventsourcing.DeleteEntityEvent; |
|
|
|
import org.thingsboard.server.dao.housekeeper.HouseKeeperService; |
|
|
|
import org.thingsboard.server.service.entitiy.AbstractTbEntityService; |
|
|
|
@ -108,19 +112,9 @@ public class DefaultTbAlarmService extends AbstractTbEntityService implements Tb |
|
|
|
} |
|
|
|
AlarmInfo alarmInfo = result.getAlarm(); |
|
|
|
if (result.isModified()) { |
|
|
|
AlarmComment alarmComment = AlarmComment.builder() |
|
|
|
.alarmId(alarm.getId()) |
|
|
|
.type(AlarmCommentType.SYSTEM) |
|
|
|
.comment(JacksonUtil.newObjectNode().put("text", String.format("Alarm was acknowledged by user %s", |
|
|
|
(user.getFirstName() == null || user.getLastName() == null) ? user.getName() : user.getFirstName() + " " + user.getLastName())) |
|
|
|
.put("userId", user.getId().toString()) |
|
|
|
.put("subtype", "ACK")) |
|
|
|
.build(); |
|
|
|
try { |
|
|
|
alarmCommentService.saveAlarmComment(alarm, alarmComment, user); |
|
|
|
} catch (ThingsboardException e) { |
|
|
|
log.error("Failed to save alarm comment", e); |
|
|
|
} |
|
|
|
String systemComment = String.format("Alarm was acknowledged by user %s", |
|
|
|
(user.getFirstName() == null || user.getLastName() == null) ? user.getName() : user.getFirstName() + " " + user.getLastName()); |
|
|
|
addSystemAlarmComment(alarmInfo, user, "ACK", systemComment); |
|
|
|
notificationEntityService.logEntityAction(alarm.getTenantId(), alarm.getOriginator(), alarmInfo, |
|
|
|
alarmInfo.getCustomerId(), ActionType.ALARM_ACK, user); |
|
|
|
} else { |
|
|
|
@ -142,19 +136,9 @@ public class DefaultTbAlarmService extends AbstractTbEntityService implements Tb |
|
|
|
} |
|
|
|
AlarmInfo alarmInfo = result.getAlarm(); |
|
|
|
if (result.isCleared()) { |
|
|
|
AlarmComment alarmComment = AlarmComment.builder() |
|
|
|
.alarmId(alarm.getId()) |
|
|
|
.type(AlarmCommentType.SYSTEM) |
|
|
|
.comment(JacksonUtil.newObjectNode().put("text", String.format("Alarm was cleared by user %s", |
|
|
|
(user.getFirstName() == null || user.getLastName() == null) ? user.getName() : user.getFirstName() + " " + user.getLastName())) |
|
|
|
.put("userId", user.getId().toString()) |
|
|
|
.put("subtype", "CLEAR")) |
|
|
|
.build(); |
|
|
|
try { |
|
|
|
alarmCommentService.saveAlarmComment(alarm, alarmComment, user); |
|
|
|
} catch (ThingsboardException e) { |
|
|
|
log.error("Failed to save alarm comment", e); |
|
|
|
} |
|
|
|
String systemComment = String.format("Alarm was cleared by user %s", |
|
|
|
(user.getFirstName() == null || user.getLastName() == null) ? user.getName() : user.getFirstName() + " " + user.getLastName()); |
|
|
|
addSystemAlarmComment(alarmInfo, user, "CLEAR", systemComment); |
|
|
|
notificationEntityService.logEntityAction(alarm.getTenantId(), alarm.getOriginator(), alarmInfo, |
|
|
|
alarmInfo.getCustomerId(), ActionType.ALARM_CLEAR, user); |
|
|
|
} else { |
|
|
|
@ -172,21 +156,10 @@ public class DefaultTbAlarmService extends AbstractTbEntityService implements Tb |
|
|
|
AlarmInfo alarmInfo = result.getAlarm(); |
|
|
|
if (result.isModified()) { |
|
|
|
AlarmAssignee assignee = alarmInfo.getAssignee(); |
|
|
|
AlarmComment alarmComment = AlarmComment.builder() |
|
|
|
.alarmId(alarm.getId()) |
|
|
|
.type(AlarmCommentType.SYSTEM) |
|
|
|
.comment(JacksonUtil.newObjectNode().put("text", String.format("Alarm was assigned by user %s to user %s", |
|
|
|
(user.getFirstName() == null || user.getLastName() == null) ? user.getName() : user.getFirstName() + " " + user.getLastName(), |
|
|
|
(assignee.getFirstName() == null || assignee.getLastName() == null) ? assignee.getEmail() : assignee.getFirstName() + " " + assignee.getLastName())) |
|
|
|
.put("userId", user.getId().toString()) |
|
|
|
.put("assigneeId", assignee.getId().toString()) |
|
|
|
.put("subtype", "ASSIGN")) |
|
|
|
.build(); |
|
|
|
try { |
|
|
|
alarmCommentService.saveAlarmComment(alarm, alarmComment, user); |
|
|
|
} catch (ThingsboardException e) { |
|
|
|
log.error("Failed to save alarm comment", e); |
|
|
|
} |
|
|
|
String systemComment = String.format("Alarm was assigned by user %s to user %s", |
|
|
|
(user.getFirstName() == null || user.getLastName() == null) ? user.getName() : user.getFirstName() + " " + user.getLastName(), |
|
|
|
(assignee.getFirstName() == null || assignee.getLastName() == null) ? assignee.getEmail() : assignee.getFirstName() + " " + assignee.getLastName()); |
|
|
|
addSystemAlarmComment(alarmInfo, user, "ASSIGN", systemComment, assignee.getId()); |
|
|
|
notificationEntityService.logEntityAction(alarm.getTenantId(), alarm.getOriginator(), alarmInfo, |
|
|
|
alarmInfo.getCustomerId(), ActionType.ALARM_ASSIGNED, user); |
|
|
|
} else { |
|
|
|
@ -203,19 +176,9 @@ public class DefaultTbAlarmService extends AbstractTbEntityService implements Tb |
|
|
|
} |
|
|
|
AlarmInfo alarmInfo = result.getAlarm(); |
|
|
|
if (result.isModified()) { |
|
|
|
AlarmComment alarmComment = AlarmComment.builder() |
|
|
|
.alarmId(alarm.getId()) |
|
|
|
.type(AlarmCommentType.SYSTEM) |
|
|
|
.comment(JacksonUtil.newObjectNode().put("text", String.format("Alarm was unassigned by user %s", |
|
|
|
(user.getFirstName() == null || user.getLastName() == null) ? user.getName() : user.getFirstName() + " " + user.getLastName())) |
|
|
|
.put("userId", user.getId().toString()) |
|
|
|
.put("subtype", "ASSIGN")) |
|
|
|
.build(); |
|
|
|
try { |
|
|
|
alarmCommentService.saveAlarmComment(alarm, alarmComment, user); |
|
|
|
} catch (ThingsboardException e) { |
|
|
|
log.error("Failed to save alarm comment", e); |
|
|
|
} |
|
|
|
String systemComment = String.format("Alarm was unassigned by user %s", |
|
|
|
(user.getFirstName() == null || user.getLastName() == null) ? user.getName() : user.getFirstName() + " " + user.getLastName()); |
|
|
|
addSystemAlarmComment(alarmInfo, user, "ASSIGN", systemComment); |
|
|
|
notificationEntityService.logEntityAction(alarm.getTenantId(), alarm.getOriginator(), alarmInfo, |
|
|
|
alarmInfo.getCustomerId(), ActionType.ALARM_UNASSIGNED, user); |
|
|
|
} else { |
|
|
|
@ -227,39 +190,17 @@ public class DefaultTbAlarmService extends AbstractTbEntityService implements Tb |
|
|
|
@Override |
|
|
|
public List<AlarmId> unassignDeletedUserAlarms(TenantId tenantId, User user, long unassignTs) { |
|
|
|
List<AlarmId> totalAlarmIds = new ArrayList<>(); |
|
|
|
List<AlarmId> alarmIds; |
|
|
|
do { |
|
|
|
alarmIds = alarmService.findAlarmIdsByAssigneeId(tenantId, user.getId(), 100); |
|
|
|
for (AlarmId alarmId : alarmIds) { |
|
|
|
log.trace("[{}] Unassigning alarm {} userId {}", tenantId, alarmId.getId(), user.getId().getId()); |
|
|
|
AlarmApiCallResult result = alarmSubscriptionService.unassignAlarm(user.getTenantId(), alarmId, unassignTs); |
|
|
|
Alarm alarm = result.getAlarm(); |
|
|
|
if (!result.isSuccessful()) { |
|
|
|
continue; |
|
|
|
} |
|
|
|
if (result.isModified()) { |
|
|
|
try { |
|
|
|
AlarmComment alarmComment = AlarmComment.builder() |
|
|
|
.alarmId(alarmId) |
|
|
|
.type(AlarmCommentType.SYSTEM) |
|
|
|
.comment(JacksonUtil.newObjectNode() |
|
|
|
.put("text", String.format("Alarm was unassigned because user with id %s - was deleted", |
|
|
|
(user.getFirstName() == null || user.getLastName() == null) ? user.getName() : user.getFirstName() + " " + user.getLastName())) |
|
|
|
.put("userId", user.getId().toString()) |
|
|
|
.put("subtype", "ASSIGN")) |
|
|
|
.build(); |
|
|
|
alarmCommentService.saveAlarmComment(alarm, alarmComment, null); |
|
|
|
} catch (ThingsboardException e) { |
|
|
|
log.error("Failed to save alarm comment", e); |
|
|
|
} |
|
|
|
notificationEntityService.logEntityAction(alarm.getTenantId(), alarm.getOriginator(), result.getAlarm(), |
|
|
|
alarm.getCustomerId(), ActionType.ALARM_UNASSIGNED, null); |
|
|
|
} |
|
|
|
|
|
|
|
totalAlarmIds.addAll(alarmIds); |
|
|
|
PageLink pageLink = new PageLink(100, 0, null, new SortOrder("id", SortOrder.Direction.ASC)); |
|
|
|
while (true) { |
|
|
|
PageData<AlarmId> pageData = alarmService.findAlarmIdsByAssigneeId(user.getTenantId(), user.getId(), pageLink); |
|
|
|
List<AlarmId> alarmIds = pageData.getData(); |
|
|
|
if (alarmIds.isEmpty()) { |
|
|
|
break; |
|
|
|
} |
|
|
|
processAlarmsUnassignment(tenantId, user, alarmIds, unassignTs); |
|
|
|
totalAlarmIds.addAll(alarmIds); |
|
|
|
pageLink = pageLink.nextPageLink(); |
|
|
|
} |
|
|
|
while (!alarmIds.isEmpty()); |
|
|
|
return totalAlarmIds; |
|
|
|
} |
|
|
|
|
|
|
|
@ -283,4 +224,47 @@ public class DefaultTbAlarmService extends AbstractTbEntityService implements Tb |
|
|
|
private static long getOrDefault(long ts) { |
|
|
|
return ts > 0 ? ts : System.currentTimeMillis(); |
|
|
|
} |
|
|
|
|
|
|
|
private void processAlarmsUnassignment(TenantId tenantId, User user, List<AlarmId> alarmIds, long unassignTs) { |
|
|
|
for (AlarmId alarmId : alarmIds) { |
|
|
|
log.trace("[{}] Unassigning alarm {} userId {}", tenantId, alarmId, user.getId()); |
|
|
|
AlarmApiCallResult result = alarmSubscriptionService.unassignAlarm(user.getTenantId(), alarmId, unassignTs); |
|
|
|
if (!result.isSuccessful()) { |
|
|
|
log.error("[{}] Cannot unassign alarm {} userId {}", tenantId, alarmId, user.getId()); |
|
|
|
continue; |
|
|
|
} |
|
|
|
if (result.isModified()) { |
|
|
|
String comment = String.format("Alarm was unassigned because user %s - was deleted", |
|
|
|
(user.getFirstName() == null || user.getLastName() == null) ? user.getName() : user.getFirstName() + " " + user.getLastName()); |
|
|
|
addSystemAlarmComment(result.getAlarm(), null, "ASSIGN", comment); |
|
|
|
notificationEntityService.logEntityAction(result.getAlarm().getTenantId(), result.getAlarm().getOriginator(), result.getAlarm(), result.getAlarm().getCustomerId(), ActionType.ALARM_UNASSIGNED, null); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private void addSystemAlarmComment(Alarm alarm, User user, String subType, String commentText) { |
|
|
|
addSystemAlarmComment(alarm, user, subType, commentText, null); |
|
|
|
} |
|
|
|
|
|
|
|
private void addSystemAlarmComment(Alarm alarm, User user, String subType, String commentText, UserId assigneeId) { |
|
|
|
ObjectNode commentNode = JacksonUtil.newObjectNode(); |
|
|
|
commentNode.put("text", commentText) |
|
|
|
.put("subtype", subType); |
|
|
|
if (user != null) { |
|
|
|
commentNode.put("userId", user.getId().getId().toString()); |
|
|
|
} |
|
|
|
if (assigneeId != null) { |
|
|
|
commentNode.put("assigneeId", assigneeId.getId().toString()); |
|
|
|
} |
|
|
|
AlarmComment alarmComment = AlarmComment.builder() |
|
|
|
.alarmId(alarm.getId()) |
|
|
|
.type(AlarmCommentType.SYSTEM) |
|
|
|
.comment(JacksonUtil.newObjectNode()) |
|
|
|
.build(); |
|
|
|
try { |
|
|
|
alarmCommentService.saveAlarmComment(alarm, alarmComment, user); |
|
|
|
} catch (ThingsboardException e) { |
|
|
|
log.error("Failed to save alarm comment", e); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|