diff --git a/viewsh-module-ops/viewsh-module-environment-biz/src/test/java/com/viewsh/module/ops/environment/manual/CleanOrderScenarioTest.java b/viewsh-module-ops/viewsh-module-environment-biz/src/test/java/com/viewsh/module/ops/environment/manual/CleanOrderScenarioTest.java new file mode 100644 index 0000000..a3ad25a --- /dev/null +++ b/viewsh-module-ops/viewsh-module-environment-biz/src/test/java/com/viewsh/module/ops/environment/manual/CleanOrderScenarioTest.java @@ -0,0 +1,130 @@ +package com.viewsh.module.ops.environment.manual; + +import com.viewsh.module.ops.environment.integration.dto.*; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.FilterType; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +/** + * 本地全链路集成测试(客户端模式 - 仅发送消息) + *

+ * 前置条件: + * 1. 本地或远程的 Ops 服务已启动。 + * 2. application.yml 配置正确连接到 RocketMQ。 + */ +@Disabled("Manual integration test, requires external RocketMQ") +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = CleanOrderScenarioTest.TestApplication.class) +public class CleanOrderScenarioTest { + + @SpringBootApplication(excludeName = { + "org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration", + "org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration", + "com.mzt.logapi.starter.configuration.LogRecordProxyAutoConfiguration" + }) + // 排除 Ops 模块的业务 Bean,防止重复启动或资源冲突 + @ComponentScan( + basePackages = {"com.viewsh.framework"}, + excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = "com.viewsh.module.*") + ) + static class TestApplication { + } + + @Autowired + private RocketMQTemplate rocketMQTemplate; + + private final Long AREA_ID = 101L; + private final Long DEVICE_ID = 5001L; + private final String DEVICE_KEY = "badge-01"; + private final String BEACON_MAC = "F0:C8:60:1D:10:BB"; + + private final Long ORDER_ID_FROM_STEP1 = 0L; + + @Test + void step1_triggerCreate() { + String eventId = UUID.randomUUID().toString(); + + CleanOrderCreateEventDTO event = new CleanOrderCreateEventDTO(); + event.setEventId(eventId); + event.setAreaId(AREA_ID); + event.setTriggerSource("IOT_TRAFFIC"); + event.setTriggerDeviceId(8001L); + event.setTriggerDeviceKey("traffic-cam-01"); + + Map data = new HashMap<>(); + data.put("actualCount", 150); + data.put("baseValue", 100); + event.setTriggerData(data); + + System.out.println(">>> 发送创建消息 start..."); + rocketMQTemplate.convertAndSend("ops-order-create", event); + System.out.println(">>> 发送创建消息成功: " + eventId); + } + + @Test + void step2_confirm() { + checkOrderId(); + CleanOrderConfirmEventDTO event = new CleanOrderConfirmEventDTO(); + event.setEventId(UUID.randomUUID().toString()); + event.setOrderId(ORDER_ID_FROM_STEP1); + event.setDeviceId(DEVICE_ID); + event.setDeviceKey(DEVICE_KEY); + + System.out.println(">>> 发送确认消息..."); + rocketMQTemplate.convertAndSend("ops-order-confirm", event); + System.out.println(">>> 发送确认消息成功"); + } + + @Test + void step3_arrive() { + checkOrderId(); + CleanOrderArriveEventDTO event = new CleanOrderArriveEventDTO(); + event.setEventId(UUID.randomUUID().toString()); + event.setOrderId(ORDER_ID_FROM_STEP1); + event.setDeviceId(DEVICE_ID); + event.setDeviceKey(DEVICE_KEY); + event.setAreaId(AREA_ID); + event.setTriggerSource("IOT_BEACON"); + + Map data = new HashMap<>(); + data.put("beaconMac", BEACON_MAC); + event.setTriggerData(data); + + System.out.println(">>> 发送到岗消息..."); + rocketMQTemplate.convertAndSend("ops-order-arrive", event); + System.out.println(">>> 发送到岗消息成功"); + } + + @Test + void step4_complete() { + checkOrderId(); + CleanOrderCompleteEventDTO event = new CleanOrderCompleteEventDTO(); + event.setEventId(UUID.randomUUID().toString()); + event.setOrderId(ORDER_ID_FROM_STEP1); + event.setDeviceId(DEVICE_ID); + event.setAreaId(AREA_ID); + event.setTriggerSource("IOT_SIGNAL_LOSS"); + + Map data = new HashMap<>(); + data.put("durationMs", 1800000); // 30 mins + event.setTriggerData(data); + + System.out.println(">>> 发送完成消息..."); + rocketMQTemplate.convertAndSend("ops-order-complete", event); + System.out.println(">>> 发送完成消息成功"); + } + + private void checkOrderId() { + if (ORDER_ID_FROM_STEP1 == 0L) { + throw new RuntimeException("请先运行 step1,并将生成的 OrderId 填入 ORDER_ID_FROM_STEP1 常量!"); + } + } +}