From 929332664363a6e496fa0367b08aa2c3689ad8fe Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期五, 24 四月 2026 21:58:15 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/1.0' into 1.0

---
 xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/schedule/ElectronicFenceFailureCompensationTask.java |   53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 53 insertions(+), 0 deletions(-)

diff --git a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/schedule/ElectronicFenceFailureCompensationTask.java b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/schedule/ElectronicFenceFailureCompensationTask.java
index c05b9a1..d03234f 100644
--- a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/schedule/ElectronicFenceFailureCompensationTask.java
+++ b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/schedule/ElectronicFenceFailureCompensationTask.java
@@ -22,6 +22,7 @@
 public class ElectronicFenceFailureCompensationTask {
 
     private static final String LOCK_KEY = "MAP:ELECTRONIC_FENCE:FAILURE_COMPENSATE";
+    private static final String LOCK_KEY_ENABLE = "MAP:ELECTRONIC_FENCE:ENABLE_COMPENSATE";
     private static final int LOCK_WAIT_SECONDS = 0;
     private static final int LOCK_LEASE_SECONDS = 15;
 
@@ -31,6 +32,10 @@
     @Resource
     private RedissonClient redissonClient;
 
+
+    /**
+     * 定时任务 围栏失效补偿定时任务
+     */
     @Scheduled(fixedDelay = 10 * 1000L)
     public void compensateExpiredFence() {
         RLock lock = redissonClient.getLock(LOCK_KEY);
@@ -78,4 +83,52 @@
             }
         }
     }
+
+    /**
+     * 围栏启动偿定时任务
+     */
+    @Scheduled(fixedDelay = 10 * 1000L)
+    public void compensateEnableFence() {
+        RLock lock = redissonClient.getLock(LOCK_KEY_ENABLE);
+        boolean locked = false;
+        try {
+            locked = lock.tryLock(LOCK_WAIT_SECONDS, LOCK_LEASE_SECONDS, TimeUnit.SECONDS);
+            if (!locked) {
+                return;
+            }
+            List<XpElectronicFence> expiredFenceList = xpElectronicFenceService.lambdaQuery()
+                    .eq(XpElectronicFence::getDeleted, 0)
+                    .eq(XpElectronicFence::getStatus, 1)//围栏状态 0=草稿 1=待启用 2=启用中 3=已停用
+                    .ge(XpElectronicFence::getFailureTime, LocalDateTime.now())//当前时间小于生效时间
+                    .list();
+            if (expiredFenceList == null || expiredFenceList.isEmpty()) {
+                return;
+            }
+            List<Long> electronicIds = expiredFenceList.stream()
+                    .map(XpElectronicFence::getId)
+                    .collect(Collectors.toList());
+            log.info("电子围栏失效补偿开始, count={}, ids={}", electronicIds.size(), electronicIds);
+            for (Long electronicId : electronicIds) {
+                try {
+                    xpElectronicFenceService.enableFence(electronicId);
+                } catch (Exception e) {
+                    log.error("电子围栏失效补偿单条处理异常, electronicId={}", electronicId, e);
+                }
+            }
+            log.info("电子围栏失效补偿完成, count={}, ids={}", electronicIds.size(), electronicIds);
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+            log.warn("电子围栏失效补偿任务获取锁被中断", e);
+        } catch (Exception e) {
+            log.error("电子围栏失效补偿任务执行异常", e);
+        } finally {
+            try {
+                if (locked && lock.isHeldByCurrentThread()) {
+                    lock.unlock();
+                }
+            } catch (Exception e) {
+                log.warn("释放电子围栏失效补偿锁失败 lockKey={}", LOCK_KEY, e);
+            }
+        }
+    }
 }

--
Gitblit v1.7.1