liujie
2026-06-09 c96fbe6b0aeb413a17c429133ee6d81d138144b9
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;
@@ -131,6 +132,7 @@
            vo.setLon(xpCheckLocation.getLocationLon());
            vo.setLat(xpCheckLocation.getLocationLat());
            vo.setAddress(xpCheckLocation.getLocationAddress());
            vo.setOpenRange(xpCheckLocation.getLocationRange());
            appXpCruiseCheckInLocationVos.add(vo);
        }
        return appXpCruiseCheckInLocationVos;
@@ -234,12 +236,6 @@
            vo.setIsInRange(true);
            vo.setMessageType(2);
            vo.setCheckLocationId(cruiseCheckInRuleLocation.getCheckLocationId());
//            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);
//            }
            return vo;
        }
        //判断时间小于10分钟首次触发和小于3分钟再次触发
@@ -317,11 +313,47 @@
        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());
    }
    /**
     * 编辑巡游打卡规则
     * @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());
        });
@@ -350,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);
    }
}