From c96fbe6b0aeb413a17c429133ee6d81d138144b9 Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期二, 09 六月 2026 10:58:52 +0800
Subject: [PATCH] Merge branch '1.0' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi into 1.0

---
 xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpElectronicFenceManagementController.java |  140 ++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 132 insertions(+), 8 deletions(-)

diff --git a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpElectronicFenceManagementController.java b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpElectronicFenceManagementController.java
index 4cfffde..62cd452 100644
--- a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpElectronicFenceManagementController.java
+++ b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpElectronicFenceManagementController.java
@@ -2,27 +2,33 @@
 
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.LocalDateTimeUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.xiaopeng.api.dto.operation.ElectronicFenceAddDto;
 import com.xiaopeng.api.dto.operation.ElectronicFenceAreaUpdateStatusDto;
 import com.xiaopeng.api.dto.operation.ElectronicFenceOperationStrategyValidateDto;
 import com.xiaopeng.api.dto.operation.ElectronicFenceUpdateDto;
-import com.xiaopeng.api.model.operation.XpElectronicFence;
-import com.xiaopeng.api.model.operation.XpElectronicFenceArea;
-import com.xiaopeng.api.model.operation.XpPoint;
-import com.xiaopeng.api.model.operation.XpRegion;
+import com.xiaopeng.api.model.operation.*;
 import com.xiaopeng.api.query.operation.ElectronicPageListQuery;
+import com.xiaopeng.api.query.operation.PointListQuery;
+import com.xiaopeng.api.query.operation.XpStationQuery;
 import com.xiaopeng.api.vo.operation.ElectronicFenceDetailVo;
 import com.xiaopeng.common.core.domain.R;
 import com.xiaopeng.common.core.exception.ServiceException;
 import com.xiaopeng.common.core.utils.bean.BeanUtils;
 import com.xiaopeng.common.core.web.page.PageInfo;
+import com.xiaopeng.common.log.annotation.AdminOperationLog;
+import com.xiaopeng.common.log.enums.AdminBusinessType;
+import com.xiaopeng.common.log.enums.AdminOperationType;
 import com.xiaopeng.map.constant.I18nKeyConstant;
-import com.xiaopeng.map.service.XpElectronicFenceAreaService;
-import com.xiaopeng.map.service.XpElectronicFenceService;
-import com.xiaopeng.map.service.XpPointService;
-import com.xiaopeng.map.service.XpRegionService;
+import com.xiaopeng.map.service.*;
+import com.xiaopeng.map.service.serviceimpl.BootCommonService;
 import com.xiaopeng.map.utils.OperationStrategyIndex;
+import com.xiaopeng.api.query.operation.FenceAndStationVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -36,7 +42,9 @@
 import javax.annotation.Resource;
 import javax.validation.Valid;
 import javax.validation.constraints.NotNull;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
@@ -46,6 +54,9 @@
 import java.util.stream.Collectors;
 
 import static com.xiaopeng.map.service.serviceimpl.XpElectronicFenceServiceImpl.getPinyinInitials;
+import com.xiaopeng.common.log.annotation.AdminOperationLog;
+import com.xiaopeng.common.log.enums.AdminBusinessType;
+import com.xiaopeng.common.log.enums.AdminOperationType;
 
 /**
  * <p>
@@ -75,6 +86,11 @@
 
     @Autowired
     private XpPointService xpPointService;
+    @Resource
+    private XpStationService xpStationService;
+    @Resource
+    private BootCommonService bootCommonService;
+
     /**
      * 查询省市管理
      */
@@ -84,6 +100,11 @@
         return R.ok(regionService.getXpRegion());
     }
 
+    @ApiOperation(value = "获取围栏和场站数据",tags = {"管理后台-电子围栏"})
+    @GetMapping(value = "/findListFenceAndStation")
+    public R<List<FenceAndStationVo>> findListFenceAndStation(String cityCode) {
+        return R.ok(xpPointService.findListFenceAndStation(cityCode));
+    }
 
     @ApiOperation(value = "获取不分页的电子围栏列表",tags = {"管理后台-电子围栏"})
     @PostMapping("/list")
@@ -114,6 +135,12 @@
      */
     @PostMapping("/add")
     @ApiOperation(value = "新增电子围栏")
+    @AdminOperationLog(
+            businessType = AdminBusinessType.ELECTRONIC_FENCE_MANAGEMENT,
+            operationType = AdminOperationType.ADD,
+            content = "新增电子围栏",
+            appendRequestData = true
+    )
     public R add(@Validated @RequestBody ElectronicFenceAddDto dto) {
         validateFenceTime(dto.getStatus(), dto.getEffectType(), dto.getEffectTime(), dto.getFailureType(), dto.getFailureTime());
         return xpElectronicFenceService.addElectronic(dto);
@@ -127,6 +154,12 @@
     @PostMapping("/updateStatus")
     @ResponseBody
     @ApiOperation(value = "修改状态")
+    @AdminOperationLog(
+            businessType = AdminBusinessType.ELECTRONIC_FENCE_MANAGEMENT,
+            operationType = AdminOperationType.EDIT,
+            content = "修改电子围栏状态",
+            appendRequestData = true
+    )
     public R updateStatus(@RequestBody ElectronicFenceAreaUpdateStatusDto dto) {
         XpElectronicFenceArea electronicFenceArea = xpElectronicFenceAreaService.getById(dto.getId());
         if (electronicFenceArea == null) {
@@ -157,6 +190,66 @@
         List<XpElectronicFenceArea> electronicFenceAreaList = xpElectronicFenceAreaService.lambdaQuery().eq(XpElectronicFenceArea::getElectronicId, id)
                 .list();
         res.setElectronicFenceAreas(electronicFenceAreaList);
+
+        //点位的总数
+        if(!electronicFenceAreaList.isEmpty()){
+            PointListQuery query1 = new PointListQuery();
+            query1.setElectronicAreaIds(electronicFenceAreaList.stream().map(XpElectronicFenceArea::getId).collect(Collectors.toList()));
+            List<XpPoint> pointList = xpPointService.findList(query1);
+
+            ElectronicFenceDetailVo.Numbers pointsNumbers = new ElectronicFenceDetailVo.Numbers();
+            if(CollUtil.isNotEmpty(pointList)){
+                LocalTime localTime = LocalTime.now();
+                //总数
+                pointsNumbers.setTotalNum(pointList.size());
+                //待测试
+                long count = pointList.stream().filter(xpPoint -> xpPoint.getOperationStatus() == 1 && xpPoint.getVerificationStatus() == 1).count();
+                pointsNumbers.setToBeTested(Integer.parseInt(count+""));
+                //测试中
+                long count2 = pointList.stream().filter(xpPoint -> xpPoint.getOperationStatus() == 1 && xpPoint.getVerificationStatus() == 2).count();
+                pointsNumbers.setTesting(Integer.parseInt(count2+""));
+                //测试不通过
+                long count3 = pointList.stream().filter(xpPoint -> xpPoint.getOperationStatus() == 1 && xpPoint.getVerificationStatus() == 4).count();
+                pointsNumbers.setTestNotPass(Integer.parseInt(count3+""));
+                //待启用
+                long count4 = pointList.stream().filter(xpPoint -> xpPoint.getOperationStatus() == 1 && (xpPoint.getVerificationStatus() == 3 || xpPoint.getVerificationStatus() == 5)).count();
+                pointsNumbers.setPendingLaunch(Integer.parseInt(count4+""));
+                //启用中
+                long count5 = pointList.stream().filter(xpPoint -> xpPoint.getOperationStatus() == 2 && xpPoint.getVerificationStatus() == 5).count();
+                pointsNumbers.setStartingUp(Integer.parseInt(count5+""));
+                //已停用
+                long count6 = pointList.stream().filter(xpPoint -> xpPoint.getOperationStatus() == 3 && xpPoint.getVerificationStatus() == 5).count();
+                pointsNumbers.setDisabled(Integer.parseInt(count6+""));
+                //已失效
+                long count7 = pointList.stream().filter(xpPoint -> xpPoint.getOperationStatus() == 4 && xpPoint.getVerificationStatus() == 5).count();
+                pointsNumbers.setExpired(Integer.parseInt(count7+""));
+            }
+            res.setPointsNumbers(pointsNumbers);
+        }
+
+        //场站总数
+        XpStationQuery query2 = new XpStationQuery();
+        query2.setElectronicId(id);
+        List<XpStation> stationList = xpStationService.findList(query2);
+
+        ElectronicFenceDetailVo.Numbers stationNumbers = new ElectronicFenceDetailVo.Numbers();
+        if(CollUtil.isNotEmpty(stationList)){
+            //status 场站状态 0=草稿 1=待启用 2=启用中 3=已停用 4=失效
+            stationNumbers.setTotalNum(stationList.size());
+            //待生效
+            long count1 = stationList.stream().filter(xpStation -> xpStation.getStatus() == 1).count();
+            stationNumbers.setPendingLaunch(Integer.parseInt(count1+""));
+            //启用中
+            long count2 = stationList.stream().filter(xpStation -> xpStation.getStatus() == 2).count();
+            stationNumbers.setStartingUp(Integer.parseInt(count2+""));
+            //已停用
+            long count3 = stationList.stream().filter(xpStation -> xpStation.getStatus() == 3).count();
+            stationNumbers.setDisabled(Integer.parseInt(count3+""));
+            //已失效
+            long count4 = stationList.stream().filter(xpStation -> xpStation.getStatus() == 4).count();
+            stationNumbers.setExpired(Integer.parseInt(count4+""));
+        }
+        res.setStationNumbers(stationNumbers);
         return R.ok(res);
     }
 
@@ -167,6 +260,12 @@
     @ApiOperation(value = "编辑电子围栏")
     @Transactional
     @ShardingSphereTransactionType(TransactionType.BASE)
+    @AdminOperationLog(
+            businessType = AdminBusinessType.ELECTRONIC_FENCE_MANAGEMENT,
+            operationType = AdminOperationType.EDIT,
+            content = "编辑电子围栏",
+            appendRequestData = true
+    )
     public R edit(@Validated @RequestBody ElectronicFenceUpdateDto dto) {
         validateFenceTime(dto.getStatus(), dto.getEffectType(), dto.getEffectTime(), dto.getFailureType(), dto.getFailureTime());
         return xpElectronicFenceService.editElectronic(dto);
@@ -232,6 +331,25 @@
                 disableCount++;
             }
         }
+
+        List<XpStation> listByElectronicId = xpStationService.findListByElectronicId(dto.getId());
+        if(CollUtil.isNotEmpty(listByElectronicId)){
+
+            for (XpStation bean : listByElectronicId) {
+                if (StrUtil.isBlank(bean.getEffectiveTimePeriod())) {
+                    continue;
+                }
+                List<OperationStrategyIndex.TimeInterval> pointIntervals = OperationStrategyIndex.parsePointEffectiveTimePeriod(bean.getEffectiveTimePeriod());
+                if (pointIntervals.isEmpty()) {
+                    continue;
+                }
+
+                boolean shouldDisable = !newIndex.isPointScheduleWithin(pointIntervals);
+                if (shouldDisable) {
+                    disableCount++;
+                }
+            }
+        }
         return R.ok(disableCount);
     }
 
@@ -242,6 +360,12 @@
     @ApiOperation(value = "复制电子围栏")
     @Transactional
     @ShardingSphereTransactionType(TransactionType.BASE)
+    @AdminOperationLog(
+            businessType = AdminBusinessType.ELECTRONIC_FENCE_MANAGEMENT,
+            operationType = AdminOperationType.ADD,
+            contentExpression = "'复制电子围栏,id=' + #p0",
+            appendRequestData = false
+    )
     public R<Long> copy(@RequestParam("id") Integer id) {
         XpElectronicFence electronicFence = xpElectronicFenceService.getById(id);
         if (electronicFence.getStatus()==2){

--
Gitblit v1.7.1