|
|
@@ -0,0 +1,121 @@
|
|
|
+package com.zksy.web.controller.cockpit;
|
|
|
+
|
|
|
+import com.zksy.cockpit.point.CockpitMonitoringPointDeviceSnapshot;
|
|
|
+import com.zksy.cockpit.point.CockpitMonitoringPointStatus;
|
|
|
+import com.zksy.cockpit.point.CockpitMonitoringPointStatusResolver;
|
|
|
+import org.junit.jupiter.api.Test;
|
|
|
+
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.Collections;
|
|
|
+
|
|
|
+import static org.junit.jupiter.api.Assertions.assertEquals;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 票 71 契约:单设备业务处置序 =「未转工单的报警 > 工单处置 > 预警」(维护者 2026-10-22 裁定 Q1=A)。
|
|
|
+ *
|
|
|
+ * <p>覆盖本次新增的二路(无报警时「有未结束工单」压过「有未解决预警」)、票 52 的窄三路
|
|
|
+ * (全部未处理报警被未结束工单承接 → WORK_ORDER),并钉住两条同日裁定:
|
|
|
+ * Q2(枚举 priority 与点位聚合语义不变)、Q3({@code monitoring/situation} 不跟随,另行在适配器注释留档)。
|
|
|
+ *
|
|
|
+ * <p>注:这些是判定逻辑的纯测试;真实后端复验(改序后 map-snapshot 读数)需后端部署后再做。
|
|
|
+ */
|
|
|
+class CockpitMonitoringPointStatusOrderTest {
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void openWorkOrderOutranksOpenWarningWhenNoAlarm() {
|
|
|
+ assertEquals(CockpitMonitoringPointStatus.WORK_ORDER,
|
|
|
+ CockpitMonitoringPointStatusResolver.deviceStatus(device(true, false, true, true)),
|
|
|
+ "无报警:未结束工单压过未解决预警(本次新增)");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void openWarningStillWinsWhenNoOpenWorkOrder() {
|
|
|
+ assertEquals(CockpitMonitoringPointStatus.WARNING,
|
|
|
+ CockpitMonitoringPointStatusResolver.deviceStatus(device(true, false, true, false)),
|
|
|
+ "只剩预警时仍判预警,不拿已结案/已取消工单倒推");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void openWorkOrderWithoutWarningStaysWorkOrder() {
|
|
|
+ assertEquals(CockpitMonitoringPointStatus.WORK_ORDER,
|
|
|
+ CockpitMonitoringPointStatusResolver.deviceStatus(device(true, false, false, true)));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void alarmsCoveredByOpenWorkOrdersOutrankWarning() {
|
|
|
+ assertEquals(CockpitMonitoringPointStatus.WORK_ORDER,
|
|
|
+ CockpitMonitoringPointStatusResolver.deviceStatus(alarmDevice(true, true, true)),
|
|
|
+ "票 52 窄三路保留:报警全被未结束工单承接 + 预警仍在 → 工单处置");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void uncoveredAlarmOutranksWorkOrderAndWarning() {
|
|
|
+ assertEquals(CockpitMonitoringPointStatus.ALARM,
|
|
|
+ CockpitMonitoringPointStatusResolver.deviceStatus(alarmDevice(true, true, false)),
|
|
|
+ "存在未转工单的报警时报警最高(未结束工单/预警都不能压过它)");
|
|
|
+ assertEquals(CockpitMonitoringPointStatus.ALARM,
|
|
|
+ CockpitMonitoringPointStatusResolver.deviceStatus(alarmDevice(false, true, false)),
|
|
|
+ "报警标志为真但无工单承接(含「查不到未处理报警行」)→ 报警,不能渲染成处置中");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ void normalAndOfflineKeepCurrentOrder() {
|
|
|
+ assertEquals(CockpitMonitoringPointStatus.NORMAL,
|
|
|
+ CockpitMonitoringPointStatusResolver.deviceStatus(device(true, false, false, false)));
|
|
|
+ assertEquals(CockpitMonitoringPointStatus.OFFLINE,
|
|
|
+ CockpitMonitoringPointStatusResolver.deviceStatus(device(false, false, false, false)));
|
|
|
+ }
|
|
|
+
|
|
|
+ /** Q2:枚举优先级一个字都没动(前端两张词表 / 图例排序 / t09 闸门因此零改动)。 */
|
|
|
+ @Test
|
|
|
+ void enumPriorityIsUnchanged() {
|
|
|
+ assertEquals(1, CockpitMonitoringPointStatus.ALARM.getPriority());
|
|
|
+ assertEquals(2, CockpitMonitoringPointStatus.WARNING.getPriority());
|
|
|
+ assertEquals(3, CockpitMonitoringPointStatus.WORK_ORDER.getPriority());
|
|
|
+ assertEquals(4, CockpitMonitoringPointStatus.NORMAL.getPriority());
|
|
|
+ assertEquals(5, CockpitMonitoringPointStatus.OFFLINE.getPriority());
|
|
|
+ assertEquals(6, CockpitMonitoringPointStatus.EMPTY.getPriority());
|
|
|
+ }
|
|
|
+
|
|
|
+ /** Q2:点位聚合仍取 min(priority),不被单设备业务序倒灌。 */
|
|
|
+ @Test
|
|
|
+ void pointAggregationStillUsesEnumPriority() {
|
|
|
+ CockpitMonitoringPointDeviceSnapshot warningOnly = device("D-W", true, false, true, false);
|
|
|
+ CockpitMonitoringPointDeviceSnapshot warningWithOpenWorkOrder = device("D-WO", true, false, true, true);
|
|
|
+
|
|
|
+ assertEquals(CockpitMonitoringPointStatus.WARNING,
|
|
|
+ CockpitMonitoringPointStatusResolver.resolve(
|
|
|
+ Arrays.asList(warningOnly, warningWithOpenWorkOrder)),
|
|
|
+ "两台设备时聚合取 WARNING(2) < WORK_ORDER(3)");
|
|
|
+ }
|
|
|
+
|
|
|
+ /** 单设备点位的自动跟随:改序的直接后果,固定下来防回退。 */
|
|
|
+ @Test
|
|
|
+ void singleDevicePointFollowsDeviceOrder() {
|
|
|
+ assertEquals(CockpitMonitoringPointStatus.WORK_ORDER,
|
|
|
+ CockpitMonitoringPointStatusResolver.resolve(Collections.singletonList(
|
|
|
+ device("D-WO", true, false, true, true))));
|
|
|
+ }
|
|
|
+
|
|
|
+ private static CockpitMonitoringPointDeviceSnapshot device(
|
|
|
+ boolean online, boolean alarm, boolean warning, boolean workOrderInProgress) {
|
|
|
+ return device("DEVICE-1", online, alarm, warning, workOrderInProgress);
|
|
|
+ }
|
|
|
+
|
|
|
+ private static CockpitMonitoringPointDeviceSnapshot device(String code, boolean online, boolean alarm,
|
|
|
+ boolean warning, boolean workOrderInProgress) {
|
|
|
+ return new CockpitMonitoringPointDeviceSnapshot(
|
|
|
+ code, code, "压力计",
|
|
|
+ online, alarm, warning, workOrderInProgress,
|
|
|
+ Collections.emptyList(), null);
|
|
|
+ }
|
|
|
+
|
|
|
+ /** 报警设备:报警标志为真,另带预警/工单与「全部未处理报警均被未结束工单承接」事实。 */
|
|
|
+ private static CockpitMonitoringPointDeviceSnapshot alarmDevice(
|
|
|
+ boolean warning, boolean workOrderInProgress, boolean alarmsCoveredByOpenWorkOrders) {
|
|
|
+ return new CockpitMonitoringPointDeviceSnapshot(
|
|
|
+ "DEVICE-1", "DEVICE-1", "压力计", null, null, null,
|
|
|
+ true, true, warning, workOrderInProgress,
|
|
|
+ Collections.emptyList(), null, true, alarmsCoveredByOpenWorkOrders);
|
|
|
+ }
|
|
|
+}
|