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-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRuleServiceImpl.java |  121 ++++++++++++++++++++++++++++++++--------
 1 files changed, 96 insertions(+), 25 deletions(-)

diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRuleServiceImpl.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRuleServiceImpl.java
index d2f37e4..6f18e7d 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRuleServiceImpl.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRuleServiceImpl.java
@@ -40,6 +40,7 @@
 import java.time.ZoneOffset;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -64,8 +65,6 @@
     @Resource
     private XpOperationUserClient xpOperationsUserClient;
 
-    @Resource
-    private XpCruiseCheckInRuleOperationsUserMapper xpCruiseCheckInRuleOperationsUserMapper;
 
 
 
@@ -73,7 +72,7 @@
     @Override
     public AppXpCruiseCheckInRuleVo getMyXpCruiseCheckInRule(Long uid) {
         List<XpCruiseCheckInRule> list = this.list(new LambdaQueryWrapper<XpCruiseCheckInRule>().eq(XpCruiseCheckInRule::getDeleted, 0)
-                .last(" and (now() BETWEEN start_time and end_time or cyclic_mode = 1)"));
+                .eq(XpCruiseCheckInRule::getOperationsUserId, uid).last(" and (now() BETWEEN start_time and end_time or cyclic_mode = 1)"));
         if(list.isEmpty()){
             return null;
         }
@@ -88,7 +87,8 @@
                 .eq(XpCruiseCheckInRuleLocation::getCruiseCheckInRuleId, xpCruiseCheckInRule.getId()));
         long count = xpCruiseCheckInRecordService.count(new LambdaQueryWrapper<XpCruiseCheckInRecord>()
                 .eq(XpCruiseCheckInRecord::getCruiseCheckInRuleId, xpCruiseCheckInRule.getId())
-                .eq(XpCruiseCheckInRecord::getDeleted, 0).eq(XpCruiseCheckInRecord::getOperationsUserId, uid));
+                .eq(XpCruiseCheckInRecord::getDeleted, 0).eq(XpCruiseCheckInRecord::getOperationsUserId, uid)
+                .last(" and DATE(check_in_time) = DATE(NOW())"));
         vo.setCheckInPointCount(count1);
         vo.setCheckInPointFinishCount(count);
         vo.setCheckInPointUnFinishCount(count1 - count);
@@ -132,6 +132,7 @@
             vo.setLon(xpCheckLocation.getLocationLon());
             vo.setLat(xpCheckLocation.getLocationLat());
             vo.setAddress(xpCheckLocation.getLocationAddress());
+            vo.setOpenRange(xpCheckLocation.getLocationRange());
             appXpCruiseCheckInLocationVos.add(vo);
         }
         return appXpCruiseCheckInLocationVos;
@@ -145,8 +146,15 @@
     @Override
     public Long saveCruiseCheckInRecord(XpCruiseCheckInRecord dto) {
         Long checkLocationId = dto.getCheckLocationId();
+        List<XpCruiseCheckInRule> list = this.list(new LambdaQueryWrapper<XpCruiseCheckInRule>().eq(XpCruiseCheckInRule::getDeleted, 0)
+                .eq(XpCruiseCheckInRule::getOperationsUserId, dto.getOperationsUserId()).last(" and (now() BETWEEN start_time and end_time or cyclic_mode = 1)"));
+        if(list.isEmpty()){
+            return null;
+        }
+        XpCruiseCheckInRule xpCruiseCheckInRule = list.get(0);
+        dto.setCruiseCheckInRuleId(xpCruiseCheckInRule.getId());
         XpCruiseCheckInRuleLocation one = xpCruiseCheckInRuleLocationService.getOne(new LambdaQueryWrapper<XpCruiseCheckInRuleLocation>()
-                .eq(XpCruiseCheckInRuleLocation::getCheckLocationId, checkLocationId));
+                .eq(XpCruiseCheckInRuleLocation::getCheckLocationId, checkLocationId).eq(XpCruiseCheckInRuleLocation::getCruiseCheckInRuleId, dto.getCruiseCheckInRuleId()));
         if(null == one){
             throw new ServiceException("打卡点位不存在", I18nKeyConstant.CHECK_IN_LOCATION_DOES_NOT_EXIST);
         }
@@ -163,10 +171,12 @@
         dto.setCheckInTime(LocalDateTime.now());
         dto.setCheckInResult(1);
         //判断当前打卡时间是否超过限定时间
-        Integer endTime = Integer.valueOf(one.getEndTime().replace(":", ""));
-        Integer nowTime = Integer.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("HHmm")));
-        if(nowTime > endTime){
-            dto.setCheckInResult(2);
+        if(StringUtils.isNotEmpty(one.getEndTime())){
+            Integer endTime = Integer.valueOf(one.getEndTime().replace(":", ""));
+            Integer nowTime = Integer.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("HHmm")));
+            if(nowTime > endTime){
+                dto.setCheckInResult(2);
+            }
         }
         dto.setDeleted(false);
         xpCruiseCheckInRecordService.save(dto);
@@ -224,12 +234,8 @@
         Map<String, Double> distance = GeodesyUtil.getDistance(xpCheckLocation.getLocationLon() + "," + xpCheckLocation.getLocationLat(), dto.getLongitude() + "," + dto.getLatitude());
         if(xpCheckLocation.getLocationRange().compareTo(new BigDecimal(distance.get("WGS84"))) >= 0){
             vo.setIsInRange(true);
-            Boolean read = redisService.getCacheObject("CHECK_IN_SCOPE:" + xpCheckLocation.getId());
-            if(null == read || !read){
-                vo.setMessageType(2);
-                vo.setCheckLocationId(cruiseCheckInRuleLocation.getCheckLocationId());
-                redisService.setCacheObject("CHECK_IN_SCOPE:" + xpCheckLocation.getId(), true, 1L, TimeUnit.HOURS);
-            }
+            vo.setMessageType(2);
+            vo.setCheckLocationId(cruiseCheckInRuleLocation.getCheckLocationId());
             return vo;
         }
         //判断时间小于10分钟首次触发和小于3分钟再次触发
@@ -283,12 +289,16 @@
             List<XpOperationsUser> data = xpOperationsUserClient.getByPhoneNumber(dto.getPhoneNumber()).getData();
             ids.addAll(data.stream().map(XpOperationsUser::getId).collect(Collectors.toList()));
         }
-        if(!list().isEmpty()){
-            List<XpCruiseCheckInRuleOperationsUser> operationsUserId = xpCruiseCheckInRuleOperationsUserMapper.selectList(new QueryWrapper<XpCruiseCheckInRuleOperationsUser>().in("operations_user_id", ids));
-            List<Integer> ruleIds = operationsUserId.stream().map(XpCruiseCheckInRuleOperationsUser::getCruiseCheckInRuleId).collect(Collectors.toList());
-            dto.setIds(ruleIds);
+        List<XpCruiseCheckInRuleListPage> xpCruiseCheckInRuleListPage = this.baseMapper.getXpCruiseCheckInRuleListPage(pageInfo, dto.getName(), ids);
+        for (XpCruiseCheckInRuleListPage cruiseCheckInRuleListPage : xpCruiseCheckInRuleListPage) {
+            long count = xpCruiseCheckInRuleLocationService.count(new LambdaQueryWrapper<XpCruiseCheckInRuleLocation>()
+                    .eq(XpCruiseCheckInRuleLocation::getCruiseCheckInRuleId, cruiseCheckInRuleListPage.getId()));
+            cruiseCheckInRuleListPage.setPointNum(count);
+            XpOperationsUser xpOperationsUser = xpOperationsUserClient.queryById(cruiseCheckInRuleListPage.getOperationsUserId()).getData();
+            cruiseCheckInRuleListPage.setUserName(xpOperationsUser.getNickName());
+            cruiseCheckInRuleListPage.setPhone(xpOperationsUser.getPhoneNumber());
+            cruiseCheckInRuleListPage.setRoleName(xpOperationsUser.getRoleName());
         }
-        List<XpCruiseCheckInRuleListPage> xpCruiseCheckInRuleListPage = this.baseMapper.getXpCruiseCheckInRuleListPage(pageInfo, dto);
         return xpCruiseCheckInRuleListPage;
     }
 
@@ -303,20 +313,51 @@
         if(null != one){
             throw new ServiceException("巡游打卡规则名称已存在");
         }
+        // 校验同一运维人员是否已存在有效规则(未删除且非循环模式或时间在有效期内)
+        long count = countByAnyOperationsUserId(dto.getRelationId(), null);
+        if (count > 0) {
+            throw new ServiceException("该运维人员已存在有效的巡游打卡规则");
+        }
+
         XpCruiseCheckInRule xpCruiseCheckInRule = new XpCruiseCheckInRule();
         BeanUtils.copyProperties(dto, xpCruiseCheckInRule);
         xpCruiseCheckInRule.setDeleted(false);
+        xpCruiseCheckInRule.setOperationsUserId(dto.getRelationId());
         this.save(xpCruiseCheckInRule);
         dto.getPoints().forEach(s->{
             s.setCruiseCheckInRuleId(xpCruiseCheckInRule.getId());
         });
         xpCruiseCheckInRuleLocationService.saveBatch(dto.getPoints());
-        Long relationId = dto.getRelationId();
+    }
 
-        XpCruiseCheckInRuleOperationsUser xpCruiseCheckInRuleOperationsUser = new XpCruiseCheckInRuleOperationsUser();
-        xpCruiseCheckInRuleOperationsUser.setCruiseCheckInRuleId(xpCruiseCheckInRule.getId());
-        xpCruiseCheckInRuleOperationsUser.setOperationsUserId(relationId);
-        xpCruiseCheckInRuleOperationsUserMapper.insert(xpCruiseCheckInRuleOperationsUser);
+
+    /**
+     * 编辑巡游打卡规则
+     * @param dto
+     */
+    @Override
+    public void updateXpCruiseCheckInRule(XpCruiseCheckInRuleDto dto) {
+        XpCruiseCheckInRule one = this.getOne(new QueryWrapper<XpCruiseCheckInRule>().like("name", dto.getName()).ne("id", dto.getId()).eq("is_deleted", 0));
+        if(null != one){
+            throw new ServiceException("巡游打卡规则名称已存在");
+        }
+        // 校验同一运维人员是否已存在有效规则(未删除且非循环模式或时间在有效期内)
+        long count = countByAnyOperationsUserId(dto.getRelationId(), dto.getId());
+        if (count > 0) {
+            throw new ServiceException("该运维人员已存在有效的巡游打卡规则");
+        }
+
+        XpCruiseCheckInRule xpCruiseCheckInRule = new XpCruiseCheckInRule();
+        BeanUtils.copyProperties(dto, xpCruiseCheckInRule);
+        xpCruiseCheckInRule.setDeleted(false);
+        xpCruiseCheckInRule.setOperationsUserId(dto.getRelationId());
+        this.updateById(xpCruiseCheckInRule);
+        // 移除原来的id
+        xpCruiseCheckInRuleLocationService.remove(new LambdaQueryWrapper<XpCruiseCheckInRuleLocation>().eq(XpCruiseCheckInRuleLocation::getCruiseCheckInRuleId, xpCruiseCheckInRule.getId()));
+        dto.getPoints().forEach(s->{
+            s.setCruiseCheckInRuleId(xpCruiseCheckInRule.getId());
+        });
+        xpCruiseCheckInRuleLocationService.saveBatch(dto.getPoints());
     }
 
 
@@ -341,6 +382,36 @@
 
         }).collect(Collectors.toList());
         info.setLocationList(collect);
+        List<XpOperationsUser> xpOperationsUser = xpOperationsUserClient.queryByIds(byId.getOperationsUserId()).getData();
+        if(null != xpOperationsUser){
+            info.setOperationsUser(xpOperationsUser.stream().map(XpOperationsUser::getNickName).collect(Collectors.toList()));
+        }
         return info;
     }
+
+    private long countByAnyOperationsUserId(String relationId, Integer excludeRuleId) {
+        if (StringUtils.isEmpty(relationId)) {
+            return 0;
+        }
+        List<String> relationIds = Arrays.stream(relationId.split(","))
+                .map(String::trim)
+                .filter(StringUtils::isNotEmpty)
+                .collect(Collectors.toList());
+        if (relationIds.isEmpty()) {
+            return 0;
+        }
+
+        LambdaQueryWrapper<XpCruiseCheckInRule> queryWrapper = new LambdaQueryWrapper<XpCruiseCheckInRule>()
+                .eq(XpCruiseCheckInRule::getDeleted, false)
+                .and(wrapper -> {
+                    wrapper.apply("find_in_set({0}, operations_user_id)", relationIds.get(0));
+                    for (int i = 1; i < relationIds.size(); i++) {
+                        wrapper.or().apply("find_in_set({0}, operations_user_id)", relationIds.get(i));
+                    }
+                });
+        if (excludeRuleId != null) {
+            queryWrapper.ne(XpCruiseCheckInRule::getId, excludeRuleId);
+        }
+        return this.count(queryWrapper);
+    }
 }

--
Gitblit v1.7.1