diff --git a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/dal/redis/ActiveOrderInfo.java b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/dal/redis/ActiveOrderInfo.java
new file mode 100644
index 0000000..eda76ab
--- /dev/null
+++ b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/dal/redis/ActiveOrderInfo.java
@@ -0,0 +1,35 @@
+package com.viewsh.module.ops.environment.dal.redis;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 客流触发的活跃工单信息 DTO
+ *
+ * 存储在 Redis Hash 中,用于快速判断区域是否有活跃的客流触发工单
+ *
+ * @author AI
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class ActiveOrderInfo {
+
+ /**
+ * 工单ID
+ */
+ private Long orderId;
+
+ /**
+ * 工单状态
+ */
+ private String status;
+
+ /**
+ * 工单优先级
+ */
+ private Integer priority;
+}
diff --git a/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/dal/redis/TrafficActiveOrderRedisDAO.java b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/dal/redis/TrafficActiveOrderRedisDAO.java
new file mode 100644
index 0000000..3b473e2
--- /dev/null
+++ b/viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/dal/redis/TrafficActiveOrderRedisDAO.java
@@ -0,0 +1,106 @@
+package com.viewsh.module.ops.environment.dal.redis;
+
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Repository;
+
+import java.util.Map;
+
+/**
+ * 客流触发活跃工单 Redis DAO
+ *
+ * 用于标记某区域是否有客流触发的活跃工单,避免重复创建。
+ *
+ * Redis Key: ops:clean:traffic:active-order:{areaId}
+ * Value: Hash { orderId, status, priority }
+ * TTL: 无(由终态主动删除)
+ *
+ * @author AI
+ */
+@Slf4j
+@Repository
+public class TrafficActiveOrderRedisDAO {
+
+ private static final String KEY_PATTERN = "ops:clean:traffic:active-order:%s";
+
+ private static final String FIELD_ORDER_ID = "orderId";
+ private static final String FIELD_STATUS = "status";
+ private static final String FIELD_PRIORITY = "priority";
+
+ @Resource
+ private StringRedisTemplate stringRedisTemplate;
+
+ /**
+ * 标记区域有活跃的客流触发工单
+ */
+ public void markActive(Long areaId, Long orderId, String status, Integer priority) {
+ String key = buildKey(areaId);
+ stringRedisTemplate.opsForHash().putAll(key, Map.of(
+ FIELD_ORDER_ID, String.valueOf(orderId),
+ FIELD_STATUS, status,
+ FIELD_PRIORITY, String.valueOf(priority)
+ ));
+ log.debug("[TrafficActiveOrderRedisDAO] 标记活跃工单: areaId={}, orderId={}, status={}, priority={}",
+ areaId, orderId, status, priority);
+ }
+
+ /**
+ * 获取区域的活跃工单信息
+ *
+ * @return 活跃工单信息,不存在返回 null
+ */
+ public ActiveOrderInfo getActive(Long areaId) {
+ String key = buildKey(areaId);
+ Map