Commit 3bec6694 by zhangxingmin

push

parent 2442dfc8
...@@ -515,21 +515,23 @@ public class CoWebSocketServer { ...@@ -515,21 +515,23 @@ public class CoWebSocketServer {
public void onMessage(Session session, String message) { public void onMessage(Session session, String message) {
// 根据会话查询对应的房间号 // 根据会话查询对应的房间号
String roomId = SESSION_ROOM.get(session); String roomId = SESSION_ROOM.get(session);
// 如果会话未关联房间,忽略消息
if (roomId == null) { if (roomId == null) {
log.warn("【WebSocket】会话未关联房间,忽略消息");
return; return;
} }
// 打印收到的原始消息
log.info("【WebSocket】收到消息,房间号: {}, 消息内容: {}", roomId, message);
try { try {
// 1. 解析 JSON 消息 // 1. 解析 JSON 消息
JsonNode json = objectMapper.readTree(message); JsonNode json = objectMapper.readTree(message);
// 获取操作类型
String action = json.get("action").asText(); String action = json.get("action").asText();
// 获取当前操作用户ID
String userId = SESSION_USER_ID.get(session); String userId = SESSION_USER_ID.get(session);
// 获取当前操作用户类型
String userType = SESSION_USER_TYPE.get(session); String userType = SESSION_USER_TYPE.get(session);
log.info("【WebSocket】解析结果: action={}, userId={}, userType={}", action, userId, userType);
// 2. 获取会话业务ID(用于操作日志记录) // 2. 获取会话业务ID(用于操作日志记录)
CoSession coSession = sessionService.getByRoomId(roomId); CoSession coSession = sessionService.getByRoomId(roomId);
String bizId = coSession != null ? coSession.getCoSessionBizId() : null; String bizId = coSession != null ? coSession.getCoSessionBizId() : null;
...@@ -538,26 +540,41 @@ public class CoWebSocketServer { ...@@ -538,26 +540,41 @@ public class CoWebSocketServer {
// --- 操作1:控制权切换(仅顾问可操作) --- // --- 操作1:控制权切换(仅顾问可操作) ---
if ("control_transfer".equals(action)) { if ("control_transfer".equals(action)) {
log.info("【控制权切换】开始处理,当前用户类型: {}", userType);
// 校验权限:只有参与者(顾问)才能切换控制权 // 校验权限:只有参与者(顾问)才能切换控制权
if (!"participant".equals(userType)) { if (!"participant".equals(userType)) {
log.warn("【控制权切换】权限不足,非顾问用户尝试切换,userType={}", userType);
sendError(session, "只有顾问可以切换控制权"); sendError(session, "只有顾问可以切换控制权");
return; return;
} }
// 解析顾问切换后的控制权信息 // 解析顾问切换后的控制权信息
String newHolderType = json.get("holderType").asText(); String newHolderType = json.get("holderType").asText();
String newHolderId = json.get("holderId").asText(); String newHolderId = json.get("holderId").asText();
log.info("【控制权切换】目标控制者: holderType={}, holderId={}", newHolderType, newHolderId);
// 构造控制权切换请求 // 构造控制权切换请求
TransferControlRequest req = new TransferControlRequest(); TransferControlRequest req = new TransferControlRequest();
req.setRoomId(roomId); req.setRoomId(roomId);
// 判断切换后的持有者类型:如果是 owner(客户)则 opType=1(开启客户操作),否则 opType=2(关闭客户操作) // 判断切换后的持有者类型:如果是 owner(客户)则 opType=1(开启客户操作),否则 opType=2(关闭客户操作)
req.setOprType(ControlHolderTypeEnum.OWNER.getItemValue().equals(newHolderType) ? 1 : 2); Integer oprType = ControlHolderTypeEnum.OWNER.getItemValue().equals(newHolderType) ? 1 : 2;
req.setOprType(oprType);
log.info("【控制权切换】操作类型: {}", oprType);
// 调用服务层切换控制权(更新数据库 + Redis) // 调用服务层切换控制权(更新数据库 + Redis)
try {
sessionService.transferControl(req); sessionService.transferControl(req);
log.info("【控制权切换】服务层调用成功,数据库和Redis已更新");
} catch (Exception e) {
log.error("【控制权切换】服务层调用失败", e);
sendError(session, "切换控制权失败:" + e.getMessage());
return;
}
// 广播控制权变更消息给房间内所有用户(包括自己) // 广播控制权变更消息给房间内所有用户(包括自己)
broadcast(roomId, message, session); broadcast(roomId, message, session);
log.info("【控制权切换】广播消息已发送");
// 记录操作日志(用于合规审计) // 记录操作日志(用于合规审计)
if (bizId != null) { if (bizId != null) {
...@@ -570,8 +587,11 @@ public class CoWebSocketServer { ...@@ -570,8 +587,11 @@ public class CoWebSocketServer {
// --- 操作2:结束共享(仅客户可操作) --- // --- 操作2:结束共享(仅客户可操作) ---
if ("end_sharing".equals(action)) { if ("end_sharing".equals(action)) {
log.info("【结束共享】开始处理,当前用户类型: {}", userType);
// 校验权限:只有所有者(客户)才能结束共享 // 校验权限:只有所有者(客户)才能结束共享
if (!"owner".equals(userType)) { if (!"owner".equals(userType)) {
log.warn("【结束共享】权限不足,非客户用户尝试结束共享,userType={}", userType);
sendError(session, "只有客户可以结束共享"); sendError(session, "只有客户可以结束共享");
return; return;
} }
...@@ -579,26 +599,29 @@ public class CoWebSocketServer { ...@@ -579,26 +599,29 @@ public class CoWebSocketServer {
// 构造结束会话请求 // 构造结束会话请求
EndSessionRequest req = new EndSessionRequest(); EndSessionRequest req = new EndSessionRequest();
req.setRoomId(roomId); req.setRoomId(roomId);
// 调用服务层结束会话(更新状态 + 停止录制 + 清理Redis) log.info("【结束共享】调用服务层结束会话");
sessionService.end(req); sessionService.end(req);
// 广播结束消息给所有用户 // 广播结束消息给所有用户
broadcast(roomId, "{\"action\":\"end_sharing\"}", null); broadcast(roomId, "{\"action\":\"end_sharing\"}", null);
log.info("【结束共享】结束消息已广播");
// 清理 Redis 中的页面状态 // 清理 Redis 中的页面状态
redisTemplate.delete(String.format(ROOM_STATE_PAGE_KEY, roomId)); redisTemplate.delete(String.format(ROOM_STATE_PAGE_KEY, roomId));
log.info("【结束共享】Redis页面状态已清理");
// 关闭房间所有连接并清理资源 // 关闭房间所有连接并清理资源
closeRoom(roomId); closeRoom(roomId);
log.info("共享已结束: roomId={}", roomId); log.info("共享已结束: roomId={}", roomId);
return; return;
} }
// --- 操作3:脱敏开关(客户操作,全房间生效) --- // --- 操作3:脱敏开关(客户操作,全房间生效) ---
if ("desensitization_switch".equals(action)) { if ("desensitization_switch".equals(action)) {
log.info("【脱敏开关】收到请求,enabled={}", json.get("enabled").asBoolean());
// 广播脱敏状态给所有人(同步显示脱敏效果) // 广播脱敏状态给所有人(同步显示脱敏效果)
broadcast(roomId, message, session); broadcast(roomId, message, session);
log.info("【脱敏开关】广播消息已发送");
// 记录操作日志 // 记录操作日志
if (bizId != null) { if (bizId != null) {
...@@ -609,13 +632,20 @@ public class CoWebSocketServer { ...@@ -609,13 +632,20 @@ public class CoWebSocketServer {
// --- 操作4:同步操作(翻页/滚动/缩放)——仅控制权持有者可操作 --- // --- 操作4:同步操作(翻页/滚动/缩放)——仅控制权持有者可操作 ---
if ("turn_the_page".equals(action) || "scroll".equals(action) || "scaling".equals(action)) { if ("turn_the_page".equals(action) || "scroll".equals(action) || "scaling".equals(action)) {
log.info("【同步操作】开始处理,action={}, 当前用户类型={}", action, userType);
// 4.1 获取当前控制权持有者信息 // 4.1 获取当前控制权持有者信息
RoomRedisInfoDTO dto = sessionService.getCurrentController(roomId); RoomRedisInfoDTO dto = sessionService.getCurrentController(roomId);
String holderType = dto.getControlHolderType(); String holderType = dto.getControlHolderType();
String holderId = dto.getControlHolderId(); String holderId = dto.getControlHolderId();
log.info("【同步操作】当前控制权: holderType={}, holderId={}", holderType, holderId);
// 4.2 校验:当前用户是否持有控制权 // 4.2 校验:当前用户是否持有控制权
if (!(holderType.equals(userType) && holderId.equals(userId))) { boolean isController = holderType.equals(userType) && holderId.equals(userId);
log.info("【同步操作】是否持有控制权: {}", isController);
if (!isController) {
log.warn("【同步操作】用户无控制权,拒绝操作,userType={}, userId={}", userType, userId);
sendError(session, "您没有控制权,无法操作"); sendError(session, "您没有控制权,无法操作");
return; return;
} }
...@@ -624,17 +654,21 @@ public class CoWebSocketServer { ...@@ -624,17 +654,21 @@ public class CoWebSocketServer {
if ("turn_the_page".equals(action) || "scroll".equals(action)) { if ("turn_the_page".equals(action) || "scroll".equals(action)) {
// 获取当前页面 JSON(从消息中提取) // 获取当前页面 JSON(从消息中提取)
String currentPage = json.has("currentPage") ? json.get("currentPage").toString() : "{}"; String currentPage = json.has("currentPage") ? json.get("currentPage").toString() : "{}";
log.info("【同步操作】更新页面状态: {}", currentPage);
// 更新数据库中的当前页面和页面历史轨迹 // 更新数据库中的当前页面和页面历史轨迹
sessionService.updateCurrentPage(roomId, currentPage, userId); sessionService.updateCurrentPage(roomId, currentPage, userId);
log.info("【同步操作】数据库已更新");
// 更新 Redis 状态(供新节点连接时同步) // 更新 Redis 状态(供新节点连接时同步)
String stateKey = String.format(ROOM_STATE_PAGE_KEY, roomId); String stateKey = String.format(ROOM_STATE_PAGE_KEY, roomId);
redisTemplate.opsForValue().set(stateKey, currentPage, 60, TimeUnit.MINUTES); redisTemplate.opsForValue().set(stateKey, currentPage, 60, TimeUnit.MINUTES);
log.info("【同步操作】Redis状态已更新");
} }
// 4.4 广播操作指令给房间内其他用户(排除自己,避免回环) // 4.4 广播操作指令给房间内其他用户(排除自己,避免回环)
broadcast(roomId, message, session); broadcast(roomId, message, session);
log.info("【同步操作】广播消息已发送");
// 4.5 记录操作日志(合规审计) // 4.5 记录操作日志(合规审计)
if (bizId != null) { if (bizId != null) {
...@@ -648,7 +682,7 @@ public class CoWebSocketServer { ...@@ -648,7 +682,7 @@ public class CoWebSocketServer {
} catch (Exception e) { } catch (Exception e) {
// 处理消息异常,向客户端返回错误信息 // 处理消息异常,向客户端返回错误信息
log.error("处理消息异常", e); log.error("处理WebSocket消息异常,消息内容: {}", message, e);
sendError(session, "服务器处理异常"); sendError(session, "服务器处理异常");
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment