xuhy
2026-04-18 3dc35915a74fb5e6042981f73830e88f45179b63
[feat] position消息处理
2个文件已添加
3个文件已修改
104 ■■■■■ 已修改文件
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/config/MessageLocalConfig.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/controller/WebSocketController.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/BusinessMsgHandler.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/PositionMsgHandler.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/WebSocketTextFrameHandler.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/config/MessageLocalConfig.java
@@ -1,13 +1,14 @@
package com.xiaopeng.pushMessage.config;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.boot.autoconfigure.context.MessageSourceProperties;
import org.springframework.boot.autoconfigure.web.WebProperties;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.LocaleResolver;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
@@ -59,4 +60,13 @@
//        return new MyLocaleResolver();
//    }
    @Bean
    ObjectMapper om() {
        // 允许对象忽略json中不存在的属性
        ObjectMapper om = new ObjectMapper();
        om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        om.registerModule(new JavaTimeModule());
        return om;
    }
}
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/controller/WebSocketController.java
@@ -1,9 +1,7 @@
package com.xiaopeng.pushMessage.webSocket.controller;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.xiaopeng.api.dto.pushMessage.SendMessageDTO;
import com.xiaopeng.api.vo.TaskVO;
import com.xiaopeng.common.core.domain.R;
@@ -15,7 +13,6 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.PostConstruct;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -34,15 +31,7 @@
    @Autowired
    private WebSocketUserService webSocketUserService;
    private ObjectMapper om;
    @PostConstruct
    void setupObjectMapper() {
        // 允许对象忽略json中不存在的属性
        om = new ObjectMapper();
        om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        om.registerModule(new JavaTimeModule());
    }
    @Autowired ObjectMapper om;
    // ==================== 基于XpAppUser的WebSocket接口 ====================
@@ -385,4 +374,5 @@
        return R.ok();
    }
}
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/BusinessMsgHandler.java
New file
@@ -0,0 +1,9 @@
package com.xiaopeng.pushMessage.webSocket.handler;
public interface BusinessMsgHandler{
    String getMessageType();
    void handle(String uid, String msg);
}
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/PositionMsgHandler.java
New file
@@ -0,0 +1,50 @@
package com.xiaopeng.pushMessage.webSocket.handler;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.xiaopeng.api.dto.account.XpOperationsUserPositionDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Component;
@Component
public class PositionMsgHandler implements BusinessMsgHandler{
    @Override
    public String getMessageType() {
        return "position";
    }
    @Override
    public void handle(String uid, String msg) {
        XpOperationsUserPositionDTO xpOperationsUserPositionDTO;
        try {
            xpOperationsUserPositionDTO = om.readValue(msg, XpOperationsUserPositionDTO.class);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
        if (null != xpOperationsUserPositionDTO) {
            xpOperationsUserPositionDTO.setId(Long.parseLong(uid));
            saveToMongo(xpOperationsUserPositionDTO);
        }
    }
    @Autowired ObjectMapper om;
    @Autowired MongoTemplate mongoTemplate;
    private void saveToMongo(XpOperationsUserPositionDTO dto) {
        XpOperationsUserPositionDTO vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("id").is(dto.getId())), XpOperationsUserPositionDTO.class);
        if (null == vehiclePosition) {
            mongoTemplate.save(dto);
        }else{
            Update update = new Update()
                    .set("id",dto.getId())
                    .set("latitude", dto.getLatitude())
                    .set("latitude", dto.getLongitude());
            mongoTemplate.updateFirst(new Query(Criteria.where("id").is(dto.getId())), update, XpOperationsUserPositionDTO.class);
        }
    }
}
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/handler/WebSocketTextFrameHandler.java
@@ -13,8 +13,9 @@
import org.springframework.util.StringUtils;
import java.time.LocalDateTime;
import java.util.Objects;
import java.util.UUID;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
 * TextWebSocketFrame 表示一个文本桢
@@ -32,6 +33,16 @@
    @Autowired
    private WebSocketAuthHandler authHandler;
    Map<String, BusinessMsgHandler> businessMsgHandlers;
    public WebSocketTextFrameHandler(List<BusinessMsgHandler> handlers) {
        this.businessMsgHandlers = handlers.stream()
                .collect(Collectors.toMap(
                        BusinessMsgHandler::getMessageType,
                        Function.identity()
                ));
    }
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {
@@ -143,6 +154,8 @@
        if (appUserId != null) {
            log.info("收到用户 {} 的业务消息: {}", appUserId, messageObj.toJSONString());
            businessMsgHandlers.get(messageObj.getString("type")).handle(appUserId, messageObj.getString("message"));
            // 回复消息
            JSONObject response = new JSONObject();
            response.put("type", "message_response");