From d9142e583e71cea79dc4074f85712e83d941d88f Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期六, 07 三月 2026 21:01:05 +0800
Subject: [PATCH] 修改小程序

---
 xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpPointServiceImpl.java |  149 ++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 133 insertions(+), 16 deletions(-)

diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpPointServiceImpl.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpPointServiceImpl.java
index ca11e93..32c0589 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpPointServiceImpl.java
+++ b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpPointServiceImpl.java
@@ -1,14 +1,13 @@
 package com.xiaopeng.operation.service.impl;
 
 
+import cn.hutool.core.collection.CollUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.xiaopeng.api.dto.operation.PointMapQuery;
 import com.xiaopeng.api.dto.order.HistoryEndPointsDto;
 import com.xiaopeng.api.dto.order.HistoryStartPointsDto;
-import com.xiaopeng.api.model.operation.XpBanner;
-import com.xiaopeng.api.model.operation.XpPoint;
-import com.xiaopeng.api.model.operation.XpSystemSetting;
+import com.xiaopeng.api.model.operation.*;
 import com.xiaopeng.api.query.operation.PointListQuery;
 import com.xiaopeng.api.query.operation.PointPageListListQuery;
 import com.xiaopeng.api.vo.order.XpHistoryEndPointsVo;
@@ -22,6 +21,8 @@
 import com.xiaopeng.operation.mapper.XpPointMapper;
 import com.xiaopeng.operation.mapper.XpSystemSettingMapper;
 import com.xiaopeng.operation.query.PointByNameQuery;
+import com.xiaopeng.operation.service.IXpElectronicFenceAreaService;
+import com.xiaopeng.operation.service.IXpElectronicFenceService;
 import com.xiaopeng.operation.service.XpPointService;
 import com.xiaopeng.operation.utils.TimeRangeChecker;
 import com.xiaopeng.operation.utils.holiday.HolidayUtil;
@@ -33,6 +34,9 @@
 import org.springframework.util.StringUtils;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -61,6 +65,12 @@
     @Resource
     private HolidayUtil holidayUtil;
 
+    @Resource
+    private IXpElectronicFenceAreaService xpElectronicFenceAreaService;
+
+    @Resource
+    private IXpElectronicFenceService xpElectronicFenceService;
+
 
     @Override
     public NearestVo nearest(NearestDto dto) {
@@ -79,16 +89,52 @@
                 .apply("ST_Distance_Sphere(point({0}, {1}), point(point_lon, point_lat)) <= {2}",
                         dto.getLongitude(), dto.getLatitude(), orderDistance));
         NearestVo nearestVo = new NearestVo();
+        if(list.isEmpty()){
+            nearestVo.setPoints(new ArrayList<>());
+            nearestVo.setTotal(0);
+            return nearestVo;
+        }
         List<NearestNextVo> nearestNextVos = new ArrayList<>();
         LocalTime now = LocalTime.now();
+        List<Long> areaIds = list.stream().map(XpPoint::getElectronicAreaId).collect(Collectors.toList());
+        List<XpElectronicFenceArea> xpElectronicFenceAreas = xpElectronicFenceAreaService.listByIds(areaIds);
+        List<Long> fenceIds = xpElectronicFenceAreas.stream().map(XpElectronicFenceArea::getElectronicId).collect(Collectors.toList());
+        List<XpElectronicFence> xpElectronicFences = new ArrayList<>();
+        if (CollUtil.isNotEmpty(fenceIds)) {
+            xpElectronicFences = xpElectronicFenceService.listByIds(fenceIds);
+        }
 
-
+        //判断当前点位是否在运营时间范围内
         for (XpPoint xpPoint : list) {
-            // 判断是否在时间段内
-            boolean intime = getInTime(now, xpPoint.getEffectivePeriod(), xpPoint.getEffectiveTimePeriod());
-            if (!intime) {
-                continue;
+            Integer operationType = xpPoint.getOperationType();
+            if(1 == operationType){
+                //与运营区同步
+                XpElectronicFenceArea xpElectronicFenceArea = xpElectronicFenceAreas.stream().filter(s -> s.getId().equals(xpPoint.getElectronicAreaId())).findFirst().orElse(null);
+                if(null == xpElectronicFenceArea){
+                    continue;
+                }
+                XpElectronicFence xpElectronicFence = xpElectronicFences.stream().filter(s -> s.getId().equals(xpElectronicFenceArea.getElectronicId())).findFirst().orElse(null);
+                if(null == xpElectronicFence){
+                    continue;
+                }
+                //失效类型 1=永不失效 2=定时失效
+                Integer failureType = xpElectronicFence.getFailureType();
+                //永不失效,但是还未到开始时间
+                if(1 == failureType && LocalDateTime.now().isBefore(xpElectronicFence.getEffectTime())){
+                    continue;
+                }else if(2 == failureType && (LocalDateTime.now().isBefore(xpElectronicFence.getEffectTime()) || LocalDateTime.now().isAfter(xpElectronicFence.getFailureTime()))){
+                    //定时失效,但是当前时间不在时间范围内
+                    continue;
+                }
+            }else{
+                //自定义时间段
+                // 判断是否在时间段内
+                boolean intime = getInTime(now, xpPoint.getEffectivePeriod(), xpPoint.getEffectiveTimePeriod());
+                if (!intime) {
+                    continue;
+                }
             }
+
             // 计算距离 小于的站点
             double v = FastDistanceCalculator.distanceFast(dto.getLatitude(), dto.getLongitude(), xpPoint.getPointLat(), xpPoint.getPointLon());
             if (v < orderDistance) {
@@ -225,17 +271,51 @@
         }
 
         LocalTime now = LocalTime.now();
-        for (XpPointsListVo xpPointsListVo : list) {
-            boolean inTime = getInTime(now, xpPointsListVo.getEffectivePeriod(), xpPointsListVo.getEffectiveTimePeriod());
-            if (!inTime) {
-                // 不在运营段
-                xpPointsListVo.setState(0);
-            }
+        List<Long> areaIds = list.stream().map(XpPointsListVo::getElectronicAreaId).collect(Collectors.toList());
+        List<XpElectronicFenceArea> xpElectronicFenceAreas = xpElectronicFenceAreaService.listByIds(areaIds);
+        List<Long> fenceIds = xpElectronicFenceAreas.stream().map(XpElectronicFenceArea::getElectronicId).collect(Collectors.toList());
 
+        List<XpElectronicFence> xpElectronicFences = new ArrayList<>();
+        if (CollUtil.isNotEmpty(fenceIds)) {
+            xpElectronicFences = xpElectronicFenceService.listByIds(fenceIds);
         }
-
+        for (XpPointsListVo xpPointsListVo : list) {
+            Integer operationType = xpPointsListVo.getOperationType();
+            if(1 == operationType){
+                //与运营区同步
+                XpElectronicFenceArea xpElectronicFenceArea = xpElectronicFenceAreas.stream().filter(s -> s.getId().equals(xpPointsListVo.getElectronicAreaId())).findFirst().orElse(null);
+                if(null == xpElectronicFenceArea){
+                    // 不在运营段
+                    xpPointsListVo.setState(0);
+                }
+                XpElectronicFence xpElectronicFence = xpElectronicFences.stream().filter(s -> s.getId().equals(xpElectronicFenceArea.getElectronicId())).findFirst().orElse(null);
+                if(null == xpElectronicFence){
+                    // 不在运营段
+                    xpPointsListVo.setState(0);
+                }
+                //失效类型 1=永不失效 2=定时失效
+                Integer failureType = xpElectronicFence.getFailureType();
+                //永不失效,但是还未到开始时间
+                if(1 == failureType && LocalDateTime.now().isBefore(xpElectronicFence.getEffectTime())){
+                    xpPointsListVo.setState(0);
+                }else if(2 == failureType && (LocalDateTime.now().isBefore(xpElectronicFence.getEffectTime()) || LocalDateTime.now().isAfter(xpElectronicFence.getFailureTime()))){
+                    //定时失效,但是当前时间不在时间范围内
+                    xpPointsListVo.setState(0);
+                }
+            }else{
+                //自定义时间段
+                // 判断是否在时间段内
+                boolean intime = getInTime(now, xpPointsListVo.getEffectivePeriod(), xpPointsListVo.getEffectiveTimePeriod());
+                if (!intime) {
+                    // 不在运营段
+                    xpPointsListVo.setState(0);
+                }
+            }
+        }
         // 组装数据 并排序 剔除不在运营段的 数据
-        List<XpPointsListVo> resultList = list.stream().peek(vo -> vo.setDistance(FastDistanceCalculator.distanceFast(query.getLat(), query.getLon(), vo.getLatitude(), vo.getLongitude()))).filter(vo -> vo.getState() == 1).collect(Collectors.toList());
+        List<XpPointsListVo> resultList = list.stream()
+                .peek(vo -> vo.setDistance(BigDecimal.valueOf(FastDistanceCalculator.distanceFast(query.getLat(), query.getLon(), vo.getLatitude(), vo.getLongitude())).setScale(0, RoundingMode.HALF_UP).doubleValue()))
+                .filter(vo -> vo.getState() == 1).collect(Collectors.toList());
 
         // 可用点位
         List<XpPointsListVo> availablePoints = resultList.stream().filter(e -> query.getElectronicAreaId() != null && e.getElectronicAreaId().equals(query.getElectronicAreaId())).sorted(Comparator.comparing(XpPointsListVo::getDistance)).collect(Collectors.toList());//
@@ -269,4 +349,41 @@
         return pageInfo;
     }
 
+
+    @Override
+    public Boolean nowInTimePoint(Long pointId) {
+        XpPoint xpPoint = this.getById(pointId);
+        if(null == xpPoint){
+            return false;
+        }
+        Integer operationType = xpPoint.getOperationType();
+        if(1 == operationType){
+            //与运营区同步
+            XpElectronicFenceArea xpElectronicFenceArea = xpElectronicFenceAreaService.getById(xpPoint.getElectronicAreaId());
+            if(null == xpElectronicFenceArea){
+                return false;
+            }
+            XpElectronicFence xpElectronicFence = xpElectronicFenceService.getById(xpElectronicFenceArea.getElectronicId());
+            if(null == xpElectronicFence){
+                return false;
+            }
+            //失效类型 1=永不失效 2=定时失效
+            Integer failureType = xpElectronicFence.getFailureType();
+            //永不失效,但是还未到开始时间
+            if(1 == failureType && LocalDateTime.now().isBefore(xpElectronicFence.getEffectTime())){
+                return false;
+            }else if(2 == failureType && (LocalDateTime.now().isBefore(xpElectronicFence.getEffectTime()) || LocalDateTime.now().isAfter(xpElectronicFence.getFailureTime()))){
+                //定时失效,但是当前时间不在时间范围内
+                return false;
+            }
+        }else{
+            //自定义时间段
+            // 判断是否在时间段内
+            boolean intime = getInTime(LocalTime.now(), xpPoint.getEffectivePeriod(), xpPoint.getEffectiveTimePeriod());
+            if (!intime) {
+                return false;
+            }
+        }
+        return true;
+    }
 }

--
Gitblit v1.7.1