吸收数字员工管理端服务恢复运营预览
This commit is contained in:
@@ -80,6 +80,22 @@ public class DigitalEmployeeAdminWorkbenchRowDto {
|
||||
private String routeDecisionId;
|
||||
@JsonProperty("service_id")
|
||||
private String serviceId;
|
||||
@JsonProperty("service_lease_id")
|
||||
private String serviceLeaseId;
|
||||
@JsonProperty("lease_holder")
|
||||
private String leaseHolder;
|
||||
@JsonProperty("lease_expires_at")
|
||||
private String leaseExpiresAt;
|
||||
@JsonProperty("restart_record_id")
|
||||
private String restartRecordId;
|
||||
@JsonProperty("restart_count")
|
||||
private Long restartCount;
|
||||
@JsonProperty("last_restart_at")
|
||||
private String lastRestartAt;
|
||||
@JsonProperty("recovery_policy_id")
|
||||
private String recoveryPolicyId;
|
||||
@JsonProperty("auto_recovery_status")
|
||||
private String autoRecoveryStatus;
|
||||
@JsonProperty("memory_id")
|
||||
private String memoryId;
|
||||
@JsonProperty("memory_key")
|
||||
|
||||
@@ -1082,6 +1082,14 @@ public class DigitalEmployeeSyncApplicationServiceImpl implements DigitalEmploye
|
||||
.approvalDecisionStatus(firstString(businessView.get("approval_decision_status"), businessView.get("approvalDecisionStatus"), payload.get("approval_decision_status"), payload.get("approvalDecisionStatus")))
|
||||
.routeDecisionId(firstString(businessView.get("route_decision_id"), payload.get("route_decision_id")))
|
||||
.serviceId(firstString(businessView.get("service_id"), businessView.get("serviceId"), payload.get("service_id"), payload.get("serviceId")))
|
||||
.serviceLeaseId(firstString(businessView.get("service_lease_id"), businessView.get("serviceLeaseId"), payload.get("service_lease_id"), payload.get("serviceLeaseId")))
|
||||
.leaseHolder(firstString(businessView.get("lease_holder"), businessView.get("leaseHolder"), payload.get("lease_holder"), payload.get("leaseHolder")))
|
||||
.leaseExpiresAt(firstString(businessView.get("lease_expires_at"), businessView.get("leaseExpiresAt"), payload.get("lease_expires_at"), payload.get("leaseExpiresAt")))
|
||||
.restartRecordId(firstString(businessView.get("restart_record_id"), businessView.get("restartRecordId"), payload.get("restart_record_id"), payload.get("restartRecordId")))
|
||||
.restartCount(numberValue(firstPresent(businessView.get("restart_count"), businessView.get("restartCount"), payload.get("restart_count"), payload.get("restartCount"))))
|
||||
.lastRestartAt(firstString(businessView.get("last_restart_at"), businessView.get("lastRestartAt"), payload.get("last_restart_at"), payload.get("lastRestartAt")))
|
||||
.recoveryPolicyId(firstString(businessView.get("recovery_policy_id"), businessView.get("recoveryPolicyId"), payload.get("recovery_policy_id"), payload.get("recoveryPolicyId")))
|
||||
.autoRecoveryStatus(firstString(businessView.get("auto_recovery_status"), businessView.get("autoRecoveryStatus"), payload.get("auto_recovery_status"), payload.get("autoRecoveryStatus")))
|
||||
.memoryId(firstString(businessView.get("memory_id"), businessView.get("memoryId"), payload.get("memory_id"), payload.get("memoryId"), "memory".equals(record.getEntityType()) ? record.getEntityId() : null))
|
||||
.memoryKey(firstString(businessView.get("memory_key"), businessView.get("memoryKey"), businessView.get("key"), payload.get("memory_key"), payload.get("memoryKey"), payload.get("key")))
|
||||
.skillId(firstString(businessView.get("skill_id"), businessView.get("skillId"), payload.get("skill_id"), payload.get("skillId")))
|
||||
@@ -1166,11 +1174,17 @@ public class DigitalEmployeeSyncApplicationServiceImpl implements DigitalEmploye
|
||||
|| StringUtils.equals(category, "service_operation")
|
||||
|| StringUtils.equals(category, "service_health")
|
||||
|| contains(kind, "managed_service")
|
||||
|| contains(kind, "managed_service_snapshot")
|
||||
|| contains(kind, "service_lease")
|
||||
|| contains(kind, "service_snapshot")
|
||||
|| contains(kind, "service_restart")
|
||||
|| contains(kind, "service_recovery")
|
||||
|| contains(kind, "doctor_service")
|
||||
|| contains(kind, "doctor_issue")
|
||||
|| StringUtils.isNotBlank(row.getServiceId());
|
||||
|| StringUtils.isNotBlank(row.getServiceId())
|
||||
|| StringUtils.isNotBlank(row.getServiceLeaseId())
|
||||
|| StringUtils.isNotBlank(row.getRestartRecordId())
|
||||
|| StringUtils.isNotBlank(row.getRecoveryPolicyId());
|
||||
}
|
||||
|
||||
private boolean isNotificationRow(DigitalEmployeeAdminWorkbenchRowDto row) {
|
||||
@@ -1320,6 +1334,10 @@ public class DigitalEmployeeSyncApplicationServiceImpl implements DigitalEmploye
|
||||
}
|
||||
String category = firstString(businessView.get("category"), payload.get("category"));
|
||||
if (StringUtils.isNotBlank(category)) return category;
|
||||
if (contains(kind, "managed_service") || contains(kind, "service_lease") || contains(kind, "service_restart")
|
||||
|| contains(kind, "service_recovery") || contains(kind, "doctor_service") || contains(kind, "doctor_issue")) {
|
||||
return contains(kind, "doctor") ? "service_health" : "service_operation";
|
||||
}
|
||||
if (contains(kind, "risk_approval")) return "risk_approval";
|
||||
if (contains(kind, "notification") || StringUtils.isNotBlank(firstString(businessView.get("notification_id"), payload.get("notification_id")))) {
|
||||
String level = firstString(businessView.get("level"), payload.get("level"));
|
||||
|
||||
@@ -818,6 +818,90 @@ class DigitalEmployeeSyncApplicationServiceImplTest {
|
||||
assertThat(result.getRecords().get(2).getServiceId()).isEqualTo("agent-server");
|
||||
}
|
||||
|
||||
@Test
|
||||
void queryAdminWorkbenchServiceOperationsReturnsLeaseRestartAndRecoveryRowsOnly() {
|
||||
when(repository.queryBusinessRecords(eq(101L), eq(null), eq(null), eq(null), eq(null), eq(null), eq(null), eq(null), eq(1L), eq(20L)))
|
||||
.thenReturn(page(List.of(
|
||||
record("outbox-service-lease", "event", "event-service-lease-1", 101L, new Date(10_000),
|
||||
Map.of(
|
||||
"entity_type", "event",
|
||||
"kind", "service_lease_acquired",
|
||||
"status", "active",
|
||||
"title", "File Server lease acquired",
|
||||
"summary", "File Server lease held by device-001",
|
||||
"service_id", "file-server",
|
||||
"service_lease_id", "lease-1",
|
||||
"lease_holder", "device-001",
|
||||
"lease_expires_at", "2026-06-13T12:30:00Z"
|
||||
),
|
||||
Map.of("id", "event-service-lease-1", "kind", "service_lease_acquired")),
|
||||
record("outbox-service-restart-record", "event", "event-service-restart-1", 101L, new Date(11_000),
|
||||
Map.of(
|
||||
"entity_type", "event",
|
||||
"kind", "service_restart_recorded",
|
||||
"status", "recorded",
|
||||
"title", "File Server restart recorded",
|
||||
"service_id", "file-server",
|
||||
"restart_record_id", "restart-1",
|
||||
"restart_count", 2,
|
||||
"last_restart_at", "2026-06-13T12:00:00Z"
|
||||
),
|
||||
Map.of("id", "event-service-restart-1", "kind", "service_restart_recorded")),
|
||||
record("outbox-service-recovery-policy", "event", "event-service-recovery-1", 101L, new Date(12_000),
|
||||
Map.of(
|
||||
"entity_type", "event",
|
||||
"kind", "service_recovery_policy_snapshot",
|
||||
"status", "observing",
|
||||
"title", "File Server recovery policy",
|
||||
"service_id", "file-server",
|
||||
"recovery_policy_id", "recovery-policy-1",
|
||||
"auto_recovery_status", "observing"
|
||||
),
|
||||
Map.of("id", "event-service-recovery-1", "kind", "service_recovery_policy_snapshot")),
|
||||
record("outbox-doctor-service", "event", "event-service-doctor-1", 101L, new Date(13_000),
|
||||
Map.of(
|
||||
"entity_type", "event",
|
||||
"kind", "doctor_service_issue",
|
||||
"status", "failed",
|
||||
"title", "服务诊断失败",
|
||||
"service_id", "agent-server",
|
||||
"reason", "health_check_failed"
|
||||
),
|
||||
Map.of("id", "event-service-doctor-1", "kind", "doctor_service_issue")),
|
||||
record("outbox-approval", "approval", "approval-1", 101L, new Date(14_000),
|
||||
Map.of("entity_type", "approval", "title", "审批", "status", "pending"),
|
||||
Map.of("id", "approval-1", "status", "pending")),
|
||||
record("outbox-notification", "notification", "notification-1", 101L, new Date(15_000),
|
||||
Map.of("entity_type", "notification", "title", "通知", "status", "unread"),
|
||||
Map.of("id", "notification-1", "status", "unread")),
|
||||
record("outbox-artifact", "artifact", "artifact-1", 101L, new Date(16_000),
|
||||
Map.of("entity_type", "artifact", "title", "产物", "status", "active"),
|
||||
Map.of("id", "artifact-1", "status", "active")),
|
||||
record("outbox-route", "event", "event-route-1", 101L, new Date(17_000),
|
||||
Map.of("entity_type", "event", "kind", "route_decision_blocked", "title", "路由阻断", "status", "blocked"),
|
||||
Map.of("id", "event-route-1", "kind", "route_decision_blocked"))
|
||||
)));
|
||||
|
||||
DigitalEmployeeAdminWorkbenchPageDto result = service.queryAdminWorkbench(
|
||||
"service_operations", null, null, null, null, null, null, null, null, null, null, null, 1L, 20L
|
||||
);
|
||||
|
||||
assertThat(result.getTotal()).isEqualTo(4);
|
||||
assertThat(result.getRecords()).extracting(DigitalEmployeeAdminWorkbenchRowDto::getEntityId)
|
||||
.containsExactly("event-service-lease-1", "event-service-restart-1", "event-service-recovery-1", "event-service-doctor-1");
|
||||
assertThat(result.getRecords().get(0).getView()).isEqualTo("service_operations");
|
||||
assertThat(result.getRecords().get(0).getServiceId()).isEqualTo("file-server");
|
||||
assertThat(result.getRecords().get(0).getServiceLeaseId()).isEqualTo("lease-1");
|
||||
assertThat(result.getRecords().get(0).getLeaseHolder()).isEqualTo("device-001");
|
||||
assertThat(result.getRecords().get(0).getLeaseExpiresAt()).isEqualTo("2026-06-13T12:30:00Z");
|
||||
assertThat(result.getRecords().get(1).getRestartRecordId()).isEqualTo("restart-1");
|
||||
assertThat(result.getRecords().get(1).getRestartCount()).isEqualTo(2L);
|
||||
assertThat(result.getRecords().get(1).getLastRestartAt()).isEqualTo("2026-06-13T12:00:00Z");
|
||||
assertThat(result.getRecords().get(2).getRecoveryPolicyId()).isEqualTo("recovery-policy-1");
|
||||
assertThat(result.getRecords().get(2).getAutoRecoveryStatus()).isEqualTo("observing");
|
||||
assertThat(result.getRecords().get(3).getSummary()).isEqualTo("health_check_failed");
|
||||
}
|
||||
|
||||
@Test
|
||||
void queryAdminWorkbenchRouteGovernanceReturnsRouteAndGovernanceRowsOnly() {
|
||||
when(repository.queryBusinessRecords(eq(101L), eq(null), eq(null), eq(null), eq(null), eq(null), eq(null), eq(null), eq(1L), eq(20L)))
|
||||
|
||||
Reference in New Issue
Block a user