From 19787c0b4f5f29026c1790bbb043b9186cdd0e11 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期二, 28 四月 2026 14:52:16 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/1.0' into 1.0

---
 xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpPointServiceImpl.java |  285 +++++++++++++++++++++++++--------------------------------
 1 files changed, 125 insertions(+), 160 deletions(-)

diff --git a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpPointServiceImpl.java b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpPointServiceImpl.java
index 548fb8a..049789d 100644
--- a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpPointServiceImpl.java
+++ b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpPointServiceImpl.java
@@ -12,15 +12,12 @@
 import com.xiaopeng.api.dto.order.HistoryEndPointsDto;
 import com.xiaopeng.api.dto.order.HistoryStartPointsDto;
 import com.xiaopeng.api.feignClient.account.XpAppUserCollectAddrClient;
-import com.xiaopeng.api.model.operation.XpElectronicFenceArea;
-import com.xiaopeng.api.model.operation.XpElectronicFence;
-import com.xiaopeng.api.model.operation.XpPoint;
-import com.xiaopeng.api.model.operation.XpRegion;
-import com.xiaopeng.api.model.operation.XpStation;
-import com.xiaopeng.api.model.operation.XpSystemSetting;
+import com.xiaopeng.api.model.operation.*;
 import com.xiaopeng.api.query.operation.FenceAndStationVo;
 import com.xiaopeng.api.query.operation.PointListQuery;
 import com.xiaopeng.api.query.operation.PointPageListListQuery;
+import com.xiaopeng.api.query.operation.XpStationQuery;
+import com.xiaopeng.api.vo.account.LoginUser;
 import com.xiaopeng.api.vo.order.XpHistoryEndPointsVo;
 import com.xiaopeng.api.vo.order.XpHistoryStartPointsVo;
 import com.xiaopeng.api.vo.order.XpPointsListVo;
@@ -31,19 +28,19 @@
 import com.xiaopeng.common.core.utils.StringUtils;
 import com.xiaopeng.common.core.web.page.PageInfo;
 import com.xiaopeng.common.redis.service.RedisService;
+import com.xiaopeng.common.security.service.TokenService;
 import com.xiaopeng.evi.oss.service.AliOssService;
 import com.xiaopeng.map.constant.I18nKeyConstant;
 import com.xiaopeng.map.dto.NearestDto;
 import com.xiaopeng.map.dto.StationDetailQueryDto;
-import com.xiaopeng.map.mapper.XpPointMapper;
 import com.xiaopeng.map.mapper.XpElectronicFenceMapper;
+import com.xiaopeng.map.mapper.XpPointMapper;
 import com.xiaopeng.map.mapper.XpRegionMapper;
 import com.xiaopeng.map.mapper.XpSystemSettingMapper;
 import com.xiaopeng.map.query.PointByNameQuery;
 import com.xiaopeng.map.service.XpElectronicFenceAreaService;
 import com.xiaopeng.map.service.XpPointService;
 import com.xiaopeng.map.service.XpStationService;
-import com.xiaopeng.map.utils.TimeRangeChecker;
 import com.xiaopeng.map.utils.holiday.HolidayUtil;
 import com.xiaopeng.map.utils.map.map.FastDistanceCalculator;
 import com.xiaopeng.map.vo.*;
@@ -116,6 +113,9 @@
 
     @Autowired
     private AliOssService aliOssService;
+    @Lazy
+    @Autowired
+    private BootCommonService bootCommonService;
 
     @Override
     @Transactional
@@ -228,10 +228,18 @@
             orderDistance = xpSystemSetting.getNearPointDistance();
         }
         // 获取所有的站点信息
-        List<XpPoint> list = list(new LambdaQueryWrapper<XpPoint>().eq(XpPoint::getOperationStatus, 2).eq(XpPoint::getPointType,1).isNotNull(XpPoint::getElectronicAreaId)
-                // 添加距离计算字段
-                .apply("ST_Distance_Sphere(point({0}, {1}), point(point_lon, point_lat)) <= {2}",
-                        dto.getLongitude(), dto.getLatitude(), orderDistance));
+        PointPageListListQuery query =  new PointPageListListQuery();
+        query.setOperationStatus(2);
+        query.setPointType(1);
+        query.setElectronicAreaIdNotNull(true);
+        query.setLongitude(dto.getLongitude());
+        query.setLatitude(dto.getLatitude());
+        query.setOrderDistance(orderDistance);
+        List<XpPoint> list = baseMapper.pageList(query);
+        // 添加距离计算字段
+//        List<XpPoint> list = list(new LambdaQueryWrapper<XpPoint>().eq(XpPoint::getOperationStatus, 2).eq(XpPoint::getPointType,1).isNotNull(XpPoint::getElectronicAreaId)
+//                .apply("ST_Distance_Sphere(point({0}, {1}), point(point_lon, point_lat)) <= {2}",
+//                        dto.getLongitude(), dto.getLatitude(), orderDistance));
         NearestVo nearestVo = new NearestVo();
         List<NearestNextVo> nearestNextVos = new ArrayList<>();
         LocalTime now = LocalTime.now();
@@ -239,7 +247,7 @@
 
         for (XpPoint xpPoint : list) {
             // 判断是否在时间段内
-            boolean intime = getInTime(now, xpPoint.getEffectivePeriod(), xpPoint.getEffectiveTimePeriod());
+            boolean intime = bootCommonService.getPointOperation(now, xpPoint);
             if (!intime) {
                 continue;
             }
@@ -325,42 +333,6 @@
     }
 
 
-
-    public boolean getInTime(LocalTime now,  Integer effectivePeriod, String effectiveTimePeriod){
-        //  2非工作日  0工作日  1节假日 3调休日
-        Integer holidayToday = holidayUtil.isHolidayToday();
-        if(effectivePeriod==1){
-            boolean inTime = TimeRangeChecker.isCurrentTimeInRanges(now,effectiveTimePeriod);
-            if (!inTime) {
-                return false;
-            }
-        }else if(effectivePeriod==2){
-            if(holidayToday!=0){
-                return false;
-            }
-            boolean inTime = TimeRangeChecker.isCurrentTimeInRanges(now,effectiveTimePeriod);
-            if (!inTime) {
-                return false;
-            }
-        }else if(effectivePeriod==3){
-            if(holidayToday!=2){
-                return false;
-            }
-            boolean inTime = TimeRangeChecker.isCurrentTimeInRanges(now,effectiveTimePeriod);
-            if (!inTime) {
-                return false;
-            }
-        }else if(effectivePeriod==4){
-            if(holidayToday!=1){
-                return false;
-            }
-            boolean inTime = TimeRangeChecker.isCurrentTimeInRanges(now,effectiveTimePeriod);
-            if (!inTime) {
-                return false;
-            }
-        }
-        return true;
-    }
 
     @Override
     public List<XpPoint> pointMap(PointMapQuery query) {
@@ -462,37 +434,47 @@
             return stationDetailVo;
         }
 
-        XpStation station = xpStationService.getById(dto.getStationId());
-        if (station == null || !isStationAvailable(station)) {
+        XpStationQuery query = new XpStationQuery();
+        query.setId(dto.getStationId());
+        query.setStatus(2);
+        List<XpStation> list = xpStationService.findList(query);
+        if(CollUtil.isEmpty(list)){
+            return stationDetailVo;
+        }
+        XpStation station = list.get(0);
+        LocalTime localTime = LocalTime.now();
+        boolean stationOperation = bootCommonService.getStationOperation(localTime, station.getOperationType(), station.getEffectivePeriod(), station.getEffectiveTimePeriod(), station.getFenceOperationStrategy());
+        if(!stationOperation){
             return stationDetailVo;
         }
 
         // 仅查询场站下运营点位,最终结果还会叠加时段/围栏有效性过滤。
-        List<XpPoint> stationPoints = this.lambdaQuery()
-                .eq(XpPoint::getStationId, station.getId())
-                .eq(XpPoint::getPointType, 1)
-                .eq(XpPoint::getOperationStatus, 2)
-                .list();
+        PointPageListListQuery queryPoint = new PointPageListListQuery();
+        queryPoint.setStationId( station.getId());
+        queryPoint.setPointType(1);
+        queryPoint.setOperationStatus(2);
+        List<XpPoint> stationPoints = this.baseMapper.pageList(queryPoint);
         if (CollUtil.isEmpty(stationPoints)) {
             return stationDetailVo;
         }
 
-        Map<Long, XpElectronicFenceArea> areaMap = buildAreaMap(stationPoints.stream()
-                .map(XpPoint::getElectronicAreaId)
-                .filter(Objects::nonNull)
-                .distinct()
-                .collect(Collectors.toList()));
-        Map<Long, XpElectronicFence> fenceMap = buildFenceMap(areaMap.values().stream()
-                .map(XpElectronicFenceArea::getElectronicId)
-                .filter(Objects::nonNull)
-                .distinct()
-                .collect(Collectors.toList()));
+//        Map<Long, XpElectronicFenceArea> areaMap = buildAreaMap(stationPoints.stream()
+//                .map(XpPoint::getElectronicAreaId)
+//                .filter(Objects::nonNull)
+//                .distinct()
+//                .collect(Collectors.toList()));
+//        Map<Long, XpElectronicFence> fenceMap = buildFenceMap(areaMap.values().stream()
+//                .map(XpElectronicFenceArea::getElectronicId)
+//                .filter(Objects::nonNull)
+//                .distinct()
+//                .collect(Collectors.toList()));
+
         Set<Long> collectStationIds = getCollectStationIds(uid);
         Set<Long> collectPointIds = getCollectPointIds(uid);
 
         // 默认点位优先置顶,其余点位再按场站内排序和距离排序。
         List<StationPointItemVo> points = stationPoints.stream()
-                .filter(point -> isPointAvailable(point, areaMap, fenceMap))
+                .filter(point -> isPointAvailable(localTime, point))
                 .map(point -> toStationPointItem(point, station.getDefaultPointId(), dto.getLatitude(), dto.getLongitude(), collectPointIds))
                 .sorted(buildStationPointComparator())
                 .collect(Collectors.toList());
@@ -519,10 +501,10 @@
         if (list.isEmpty()) {
             return searchVo;
         }
-
         LocalTime now = LocalTime.now();
         for (XpPointsListVo xpPointsListVo : list) {
-            boolean inTime = getInTime(now, xpPointsListVo.getEffectivePeriod(), xpPointsListVo.getEffectiveTimePeriod());
+
+            boolean inTime = bootCommonService.getPointOperation_vo(now, xpPointsListVo);
             if (!inTime) {
                 // 不在运营段
                 xpPointsListVo.setState(0);
@@ -557,35 +539,16 @@
         return orderDistanceVo;
     }
 
+
     @Override
-    public PageInfo<XpPoint> pageList(PointPageListListQuery query) {
-        if(CollUtil.isNotEmpty(query.getFenceAndStationList())){
-            List<String> fenceAreaIds = new ArrayList<>();
-            List<String> stationIds = new ArrayList<>();
-            for (FenceAndStationVo bean : query.getFenceAndStationList()) {
-                if(bean.getType()==1){
-                    fenceAreaIds.addAll(StrUtil.split(bean.getIds(),",") );
-                }else{
-                    stationIds.addAll(StrUtil.split(bean.getIds(),",") );
-                }
-            }
-            query.setFenceAreaIds(fenceAreaIds);
-            query.setStationIds(stationIds);
+    public List<XpPoint> pageList(PageInfo<XpPoint> pageInfo, PointPageListListQuery query) {
+        List<XpPoint> list = null;
+        if (pageInfo == null) {
+            list = this.baseMapper.pageList(query);
+        }else{
+            list = this.baseMapper.pageList(pageInfo,query);
         }
 
-
-        PageInfo<XpPoint> pageInfo = new PageInfo<>(query.getPageNum(),query.getPageSize());
-        if (StringUtils.isNotBlank(query.getPointLonAndLat())) {
-            List<String> lonAndLat = query.getPointLonAndLat().trim().contains(",") ? Arrays.asList(query.getPointLonAndLat().split(",")) :
-                    query.getPointLonAndLat().trim().contains(" ") ? Arrays.asList(query.getPointLonAndLat().split(" ")) :
-                            Collections.emptyList();
-            if (CollUtil.isNotEmpty(lonAndLat)) {
-                query.setPointLon(lonAndLat.get(0));
-                query.setPointLat(lonAndLat.get(1));
-                query.setPointLonAndLat(null);
-            }
-        }
-        List<XpPoint> list = this.baseMapper.pageList(pageInfo,query);
         if(CollUtil.isNotEmpty(list)){
             /**
              * hover在状态标签时,展示信息
@@ -603,11 +566,11 @@
                 }
                 if(point.getVerificationStatus()==5 && point.getOperationStatus() == 1){
                     if(point.getOperationType() ==  1){//运营类型 1=与运营区同步 2=自定义时间段
-                         ;
+                        ;
                         //[{"name": "策略组1", "time": ["06:00-12:00", "13:00-22:59"], "type": 0, "typeStr": []},
                         // {"name": "策略组2", "time": ["05:00-12:00", "12:00-16:00"], "type": 2, "typeStr": ""},
                         // {"name": "策略组3", "time": ["09:00-21:59"], "type": 1, "typeStr": ""}]
-                        JSONArray electronicOperationStrategys = JSONArray.parseArray(point.getElectronicOperationStrategy());
+                        JSONArray electronicOperationStrategys = JSONArray.parseArray(point.getFenceOperationStrategy());
                         if(!electronicOperationStrategys.isEmpty()){
                             StringJoiner joiner = new StringJoiner(";");
                             for (Object electronicOperationStrategy : electronicOperationStrategys) {
@@ -622,13 +585,43 @@
                         if(StrUtil.isNotBlank(point.getEffectiveTimePeriod()) ){
                             List<String> effectiveTimePeriods = JSONArray.parseArray(point.getEffectiveTimePeriod(), String.class);
                             hoverStatusDes = String.join(";", effectiveTimePeriods);
-//                        hoverStatusDes = "待生效:"+point.getElectronicEffectTime().toString()  ;
                         }
                     }
                 }
                 point.setHoverStatusDes(hoverStatusDes);
             }
         }
+        return list;
+    }
+
+    @Override
+    public PageInfo<XpPoint> pageList(PointPageListListQuery query) {
+        if(CollUtil.isNotEmpty(query.getFenceAndStationList())){
+            List<String> fenceAreaIds = new ArrayList<>();
+            List<String> stationIds = new ArrayList<>();
+            for (FenceAndStationVo bean : query.getFenceAndStationList()) {
+                if(bean.getType()==1){
+                    fenceAreaIds.addAll(StrUtil.split(bean.getIds(),",") );
+                }else{
+                    stationIds.addAll(StrUtil.split(bean.getIds(),",") );
+                }
+            }
+            query.setFenceAreaIds(fenceAreaIds);
+            query.setStationIds(stationIds);
+        }
+
+        PageInfo<XpPoint> pageInfo = new PageInfo<>(query.getPageNum(),query.getPageSize());
+        if (StringUtils.isNotBlank(query.getPointLonAndLat())) {
+            List<String> lonAndLat = query.getPointLonAndLat().trim().contains(",") ? Arrays.asList(query.getPointLonAndLat().split(",")) :
+                    query.getPointLonAndLat().trim().contains(" ") ? Arrays.asList(query.getPointLonAndLat().split(" ")) :
+                            Collections.emptyList();
+            if (CollUtil.isNotEmpty(lonAndLat)) {
+                query.setPointLon(lonAndLat.get(0));
+                query.setPointLat(lonAndLat.get(1));
+                query.setPointLonAndLat(null);
+            }
+        }
+        List<XpPoint> list = this.pageList(pageInfo,query);
         pageInfo.setRecords(list);
         return pageInfo;
     }
@@ -652,75 +645,19 @@
                 .collect(Collectors.toMap(XpElectronicFence::getId, fence -> fence, (a, b) -> a));
     }
 
-    /**
-     * 场站可展示判断:
-     * 1. 状态必须为启用中;
-     * 2. 与运营区同步时,依赖运营区和围栏的当前有效性;
-     * 3. 自定义时段时,依赖场站自身时段配置。
-     */
-    private boolean isStationAvailable(XpStation station) {
-        if (station == null || !Integer.valueOf(6).equals(station.getStatus())) {
-            return false;
-        }
-        if (Integer.valueOf(1).equals(station.getOperationType())) {
-            if (station.getElectronicAreaId() == null) {
-                return false;
-            }
-            XpElectronicFenceArea area = xpElectronicFenceAreaService.getById(station.getElectronicAreaId());
-            if (area == null || !Integer.valueOf(1).equals(area.getAreaStatus()) || area.getElectronicId() == null) {
-                return false;
-            }
-            XpElectronicFence fence = xpElectronicFenceMapper.selectById(area.getElectronicId());
-            return isFenceAvailable(fence);
-        }
-        if (Integer.valueOf(2).equals(station.getOperationType())
-                && station.getEffectivePeriod() != null
-                && StringUtils.isNotBlank(station.getEffectiveTimePeriod())) {
-            return getInTime(LocalTime.now(), station.getEffectivePeriod(), station.getEffectiveTimePeriod());
-        }
-        return false;
-    }
+
 
     /**
      * 子点位是否可展示与场站卡片中。
      * 规则与现有点位有效性保持一致,避免地图页和其他点位查询出现口径偏差。
      */
-    private boolean isPointAvailable(XpPoint point, Map<Long, XpElectronicFenceArea> areaMap, Map<Long, XpElectronicFence> fenceMap) {
-        if (point == null || !Integer.valueOf(2).equals(point.getOperationStatus())) {
-            return false;
-        }
-        if (Integer.valueOf(1).equals(point.getOperationType())) {
-            if (point.getElectronicAreaId() == null) {
-                return false;
-            }
-            XpElectronicFenceArea area = areaMap.get(point.getElectronicAreaId());
-            if (area == null || !Integer.valueOf(1).equals(area.getAreaStatus()) || area.getElectronicId() == null) {
-                return false;
-            }
-            return isFenceAvailable(fenceMap.get(area.getElectronicId()));
-        }
-        if (Integer.valueOf(2).equals(point.getOperationType())
-                && point.getEffectivePeriod() != null
-                && StringUtils.isNotBlank(point.getEffectiveTimePeriod())) {
-            return getInTime(LocalTime.now(), point.getEffectivePeriod(), point.getEffectiveTimePeriod());
-        }
-        return false;
+    private boolean isPointAvailable(LocalTime localTime,  XpPoint point) {
+
+        return bootCommonService.getPointOperation(localTime, point);
+
     }
 
-    /**
-     * 围栏生效判断:
-     * 启用中,且当前时间需要落在生效时间与失效时间窗口内。
-     */
-    private boolean isFenceAvailable(XpElectronicFence fence) {
-        if (fence == null || !Integer.valueOf(2).equals(fence.getStatus())) {
-            return false;
-        }
-        LocalDateTime now = LocalDateTime.now();
-        if (fence.getEffectTime() != null && now.isBefore(fence.getEffectTime())) {
-            return false;
-        }
-        return !Integer.valueOf(2).equals(fence.getFailureType()) || fence.getFailureTime() == null || !now.isAfter(fence.getFailureTime());
-    }
+
 
     /**
      * 组装单个场站子点位返回对象,并在有默认点位配置时打标。
@@ -881,4 +818,32 @@
         }
     }
 
+    @Resource
+    private TokenService tokenService;
+
+
+    /**
+     * 场站 失效-围栏失效 场站失效
+     * @param electronicAreaIds
+     */
+    @Override
+    public void setStatusFailure(List<Long> electronicAreaIds){
+        if(CollUtil.isNotEmpty(electronicAreaIds)){
+            LambdaQueryWrapper<XpPoint> query = new LambdaQueryWrapper<>();
+            query.in(XpPoint::getElectronicAreaId, electronicAreaIds);
+            query.eq(XpPoint::getDeleted, 0);
+
+            List<XpPoint> list = super.list(query);
+            if(!list.isEmpty()){
+                LoginUser loginUser = tokenService.getLoginUser();
+                for (XpPoint bean : list) {
+
+                    bean.setUpdateBy(loginUser.getUsername());
+                    bean.setUpdateTime(LocalDateTime.now());
+                    bean.setOperationStatus(4);//场站状态 0=草稿 1=待启用 2=启用中 3=已停用 4=失效
+                    boolean b = updateById(bean);
+                }
+            }
+        }
+    }
 }

--
Gitblit v1.7.1