From 8185191dd17740800237dd8b81051b7eeb289fcb Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期四, 12 二月 2026 15:25:06 +0800
Subject: [PATCH] Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi

---
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpElectronicFenceServiceImpl.java |  114 ++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 104 insertions(+), 10 deletions(-)

diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpElectronicFenceServiceImpl.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpElectronicFenceServiceImpl.java
index 8028cc6..38a6509 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpElectronicFenceServiceImpl.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpElectronicFenceServiceImpl.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.google.common.collect.ImmutableMap;
 import com.xiaopeng.api.model.map.XpGeoFencingPolygon;
 import com.xiaopeng.api.model.map.XpGeoFencingProhibitedPolygon;
 import com.xiaopeng.api.model.operation.XpElectronicFence;
@@ -9,11 +10,15 @@
 import com.xiaopeng.api.model.operation.XpPoint;
 import com.xiaopeng.common.core.domain.R;
 import com.xiaopeng.common.core.exception.ServiceException;
+import com.xiaopeng.common.core.utils.DateUtils;
 import com.xiaopeng.common.core.utils.bean.BeanUtils;
 import com.xiaopeng.common.core.web.page.PageInfo;
 import com.xiaopeng.operation.constant.I18nKeyConstant;
 import com.xiaopeng.api.dto.operation.ElectronicFenceAddDto;
 import com.xiaopeng.api.dto.operation.ElectronicFenceUpdateDto;
+import com.xiaopeng.operation.job.base.QuartzManager;
+import com.xiaopeng.operation.job.base.TimeJobType;
+import com.xiaopeng.operation.job.jobs.ElectronicEffectJob;
 import com.xiaopeng.operation.mapper.XpElectronicFenceAreaMapper;
 import com.xiaopeng.operation.mapper.XpElectronicFenceMapper;
 import com.xiaopeng.operation.mapper.XpPointMapper;
@@ -28,13 +33,11 @@
 import org.springframework.data.mongodb.core.geo.GeoJsonPolygon;
 import org.springframework.data.mongodb.core.query.Criteria;
 import org.springframework.data.mongodb.core.query.Query;
-import org.springframework.data.mongodb.core.query.Update;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -63,7 +66,7 @@
     public PageInfo<XpElectronicFence> pageList(ElectronicPageListQuery query) {
         PageInfo<XpElectronicFence> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
         List<XpElectronicFence> list = this.baseMapper.pageList(pageInfo, query);
-        if (list.isEmpty()){
+        if (list.isEmpty()) {
             return new PageInfo<>();
         }
         List<Long> electronicIds = list.stream().map(XpElectronicFence::getId).collect(Collectors.toList());
@@ -72,7 +75,7 @@
                 .collect(Collectors.groupingBy(XpElectronicFenceArea::getElectronicId));
         for (XpElectronicFence xpElectronicFence : list) {
             List<XpElectronicFenceArea> xpElectronicFenceAreas = electronicFenceAreaMap.get(xpElectronicFence.getId());
-            if (xpElectronicFenceAreas != null){
+            if (xpElectronicFenceAreas != null) {
                 xpElectronicFence.setOperatingAreaCount(xpElectronicFenceAreas.stream().filter(xpElectronicFenceArea -> xpElectronicFenceArea.getAreaType() == 1).count());
                 xpElectronicFence.setProhibitedAreaCount(xpElectronicFenceAreas.stream().filter(xpElectronicFenceArea -> xpElectronicFenceArea.getAreaType() == 2).count());
 
@@ -114,6 +117,7 @@
             // 保存主表数据
             XpElectronicFence xpElectronicFence = new XpElectronicFence();
             BeanUtils.copyProperties(dto, xpElectronicFence);
+            xpElectronicFence.setStatus(0);
 
             if (dto.getStatus() == 0) {
                 xpElectronicFence.setStatus(0);
@@ -126,7 +130,6 @@
                     if (dto.getEffectTime().isBefore(LocalDateTime.now())) {
                         // 设置为启用中
                         xpElectronicFence.setStatus(2);
-
                     } else {
                         xpElectronicFence.setStatus(1);
                     }
@@ -134,6 +137,58 @@
             }
             xpElectronicFence.setCityCode(dto.getCityCode());
             this.save(xpElectronicFence);
+            if (dto.getStatus() == 0) {
+                xpElectronicFence.setStatus(0);
+            } else if (dto.getStatus() == 1) {
+                if (dto.getEffectType() == 1) {
+                    // 设置为启用中
+                    xpElectronicFence.setStatus(2);
+                    xpElectronicFence.setEffectTime(LocalDateTime.now());
+                } else {
+                    if (dto.getEffectTime().isBefore(LocalDateTime.now())) {
+                        // 设置为启用中
+                        xpElectronicFence.setStatus(2);
+                    } else {
+                        // 添加定时任务job type=1电子围栏生效 type=2电子围栏失效
+                        Map<String, ? extends Object> maps =
+                                new ImmutableMap.Builder<String, Long>().
+                                        put("type", 1L)
+                                        .put("id", xpElectronicFence.getId())
+                                        .build();
+                        QuartzManager.addJob(
+                                ElectronicEffectJob.class,
+                                (ElectronicEffectJob.effect + xpElectronicFence.getId()).toUpperCase(),
+                                TimeJobType.ELECTRONIC_EFFECT,
+                                DateUtils.localDateTimeToDate(dto.getEffectTime()),
+                                maps
+                        );
+                        xpElectronicFence.setStatus(1);
+                    }
+                }
+                if (dto.getFailureType() != null && dto.getFailureType() == 2) {
+
+                    if (dto.getFailureTime().isBefore(LocalDateTime.now())) {
+                        // 设置待启用
+                        xpElectronicFence.setStatus(1);
+                    } else {
+                        // 添加定时任务job type=1电子围栏生效 type=2电子围栏失效
+                        Map<String, ? extends Object> maps =
+                                new ImmutableMap.Builder<String, Long>().
+                                        put("type", 2L)
+                                        .put("id", xpElectronicFence.getId())
+                                        .build();
+                        QuartzManager.addJob(
+                                ElectronicEffectJob.class,
+                                (ElectronicEffectJob.failure + xpElectronicFence.getId()).toUpperCase(),
+                                TimeJobType.ELECTRONIC_FAILURE,
+                                DateUtils.localDateTimeToDate(dto.getEffectTime()),
+                                maps
+                        );
+                        xpElectronicFence.setStatus(1);
+                    }
+                }
+            }
+            this.updateById(xpElectronicFence);
             if (xpElectronicFence.getStatus() == 2) {
                 // 设置电子围栏ID并保存区域数据
                 for (XpElectronicFenceArea area : newElectronicFenceAreas) {
@@ -225,6 +280,46 @@
                         // 设置为启用中
                         xpElectronicFence.setStatus(2);
                     } else {
+                        // 先删除以前的定时任务
+                        QuartzManager.removeJob((ElectronicEffectJob.effect + xpElectronicFence.getId()).toUpperCase(), TimeJobType.ELECTRONIC_EFFECT);
+
+                        // 添加定时任务job type=1电子围栏生效 type=2电子围栏失效
+                        Map<String, ? extends Object> maps =
+                                new ImmutableMap.Builder<String, Long>().
+                                        put("type", 1L)
+                                        .put("id", xpElectronicFence.getId())
+                                        .build();
+                        QuartzManager.addJob(
+                                ElectronicEffectJob.class,
+                                (ElectronicEffectJob.effect + xpElectronicFence.getId()).toUpperCase(),
+                                TimeJobType.ELECTRONIC_EFFECT,
+                                DateUtils.localDateTimeToDate(dto.getEffectTime()),
+                                maps
+                        );
+                        xpElectronicFence.setStatus(1);
+                    }
+                }
+                if (dto.getFailureType() != null && dto.getFailureType() == 2) {
+
+                    if (dto.getFailureTime().isBefore(LocalDateTime.now())) {
+                        // 设置待启用
+                        xpElectronicFence.setStatus(1);
+                    } else {
+                        // 先删除以前的定时任务
+                        QuartzManager.removeJob((ElectronicEffectJob.failure + xpElectronicFence.getId()).toUpperCase(), TimeJobType.ELECTRONIC_FAILURE);
+                        // 添加定时任务job type=1电子围栏生效 type=2电子围栏失效
+                        Map<String, ? extends Object> maps =
+                                new ImmutableMap.Builder<String, Long>().
+                                        put("type", 2L)
+                                        .put("id", xpElectronicFence.getId())
+                                        .build();
+                        QuartzManager.addJob(
+                                ElectronicEffectJob.class,
+                                (ElectronicEffectJob.failure + xpElectronicFence.getId()).toUpperCase(),
+                                TimeJobType.ELECTRONIC_FAILURE,
+                                DateUtils.localDateTimeToDate(dto.getEffectTime()),
+                                maps
+                        );
                         xpElectronicFence.setStatus(1);
                     }
                 }
@@ -249,7 +344,7 @@
                         query.addCriteria(Criteria.where("fenceId").is(String.valueOf(xpElectronicFence.getId())));
                         query.addCriteria(Criteria.where("areaId").is(String.valueOf(newElectronicFenceArea.getId())));
                         XpGeoFencingPolygon old = mongoTemplate.findOne(query, XpGeoFencingPolygon.class);
-                        if (old==null){
+                        if (old == null) {
                             XpGeoFencingPolygon xpGeoFencingPolygon = new XpGeoFencingPolygon();
                             xpGeoFencingPolygon.setFenceId(String.valueOf(xpElectronicFence.getId()));
                             xpGeoFencingPolygon.setName(xpElectronicFence.getElectronicName());
@@ -259,7 +354,7 @@
                             GeoJsonPolygon geoJsonPolygon = convertToGeoJsonPolygon(newElectronicFenceArea.getFencePoints());
                             xpGeoFencingPolygon.setPoints(geoJsonPolygon);
                             mongoTemplate.insert(xpGeoFencingPolygon);
-                        }else{
+                        } else {
                             // 如果存在,则更新已有文档
                             old.setFenceId(String.valueOf(xpElectronicFence.getId()));
                             old.setName(xpElectronicFence.getElectronicName());
@@ -280,7 +375,7 @@
                         query.addCriteria(Criteria.where("fenceId").is(String.valueOf(xpElectronicFence.getId())));
                         query.addCriteria(Criteria.where("areaId").is(String.valueOf(newElectronicFenceArea.getId())));
                         XpGeoFencingProhibitedPolygon old = mongoTemplate.findOne(query, XpGeoFencingProhibitedPolygon.class);
-                        if (old==null) {
+                        if (old == null) {
                             XpGeoFencingProhibitedPolygon xpGeoFencingProhibitedPolygon = new XpGeoFencingProhibitedPolygon();
                             xpGeoFencingProhibitedPolygon.setFenceId(String.valueOf(xpElectronicFence.getId()));
                             xpGeoFencingProhibitedPolygon.setName(xpElectronicFence.getElectronicName());
@@ -289,7 +384,7 @@
                             GeoJsonPolygon geoJsonPolygon = convertToGeoJsonPolygon(newElectronicFenceArea.getFencePoints());
                             xpGeoFencingProhibitedPolygon.setPoints(geoJsonPolygon);
                             mongoTemplate.save(xpGeoFencingProhibitedPolygon);
-                        }else{
+                        } else {
                             old.setFenceId(String.valueOf(xpElectronicFence.getId()));
                             old.setName(xpElectronicFence.getElectronicName());
                             old.setAreaId(String.valueOf(newElectronicFenceArea.getId()));
@@ -479,7 +574,6 @@
     }
 
     /**
-     *
      * @return
      */
     @Override

--
Gitblit v1.7.1