xuhy
2026-04-18 c86e794fbd49c90a3abd953be65f100de26e24d6
xp-robotaxi-push-message-boot/src/main/java/com/xiaopeng/pushMessage/webSocket/controller/WebSocketController.java
@@ -1,7 +1,11 @@
package com.xiaopeng.pushMessage.webSocket.controller;
import com.alibaba.fastjson.JSONObject;
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;
import com.xiaopeng.common.core.web.controller.BaseController;
import com.xiaopeng.pushMessage.webSocket.service.WebSocketUserService;
@@ -11,6 +15,7 @@
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;
@@ -28,6 +33,16 @@
    @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());
    }
    // ==================== 基于XpAppUser的WebSocket接口 ====================
@@ -135,6 +150,40 @@
    @ApiOperation(value = "发送车辆实时定位")
    @PostMapping("/inner/websocket/order/sendVehicleLocation")
    public R<String> sendVehicleLocation(@RequestBody SendMessageDTO dto) {
        try {
            String message = dto.getMessage();
            if (message.trim().isEmpty()) {
                return R.fail("消息内容不能为空");
            }
            String appUserId = dto.getAppUserId();
            if (appUserId.trim().isEmpty()) {
                return R.fail("用户id不能为空");
            }
            int deviceCount = webSocketUserService.sendMessageToUser(appUserId, message);
            if (deviceCount > 0) {
                return R.ok("消息发送成功,发送到 " + deviceCount + " 个设备");
            } else {
                return R.fail("用户不在线或发送失败");
            }
        } catch (Exception e) {
            log.error("向用户发送消息失败", e);
            return R.fail("发送消息失败: " + e.getMessage());
        }
    }
    /**
     * 发送是否开启倒计时
     * {
     *     "appUserId":"-1",
     *     {"type":"OPEN_TRUNK","content":"{\"orderId\":\"1983875114637811713\",\"isOpen\":1}","timestamp":"176569945845456"}
     * }
     *
     * @param dto 消息实体
     * @return 操作结果
     */
    @ApiOperation(value = "发送是否开启倒计时")
    @PostMapping("/inner/websocket/order/sendOpenTrunk")
    public R<String> sendOpenTrunk(@RequestBody SendMessageDTO dto) {
        try {
            String message = dto.getMessage();
            if (message.trim().isEmpty()) {
@@ -322,4 +371,18 @@
            return R.fail("获取在线用户列表失败: " + e.getMessage());
        }
    }
    /**
     * 运维工单app推送
     */
    @PostMapping("/inner/websocket/push/task")
    public R<?> pushTask(@RequestBody TaskVO vo) throws JsonProcessingException {
        String handleUserId = vo.getHandleUserId();
        String msg = om.writeValueAsString(vo);
        webSocketUserService.sendMessageToUser(handleUserId, msg);
        return R.ok();
    }
}