Commit f9b0f3a2 by zhangxingmin

push

parent 3bec6694
...@@ -540,6 +540,7 @@ public class CoWebSocketServer { ...@@ -540,6 +540,7 @@ public class CoWebSocketServer {
// --- 操作1:控制权切换(仅顾问可操作) --- // --- 操作1:控制权切换(仅顾问可操作) ---
if ("control_transfer".equals(action)) { if ("control_transfer".equals(action)) {
// 打印开始处理日志,包含当前操作用户类型(owner/participant)
log.info("【控制权切换】开始处理,当前用户类型: {}", userType); log.info("【控制权切换】开始处理,当前用户类型: {}", userType);
// 校验权限:只有参与者(顾问)才能切换控制权 // 校验权限:只有参与者(顾问)才能切换控制权
...@@ -549,15 +550,15 @@ public class CoWebSocketServer { ...@@ -549,15 +550,15 @@ public class CoWebSocketServer {
return; return;
} }
// 解析顾问切换后的控制权信息 // 从WebSocket消息中解析目标控制权持有者类型(owner/participant)
// 注意:前端可能不传递 holderId 或传递空值,因此不能直接信任
String newHolderType = json.get("holderType").asText(); String newHolderType = json.get("holderType").asText();
String newHolderId = json.get("holderId").asText(); log.info("【控制权切换】目标控制者类型: holderType={}", newHolderType);
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(关闭客户操作 // 根据目标类型确定操作类型:1=授权客户(owner),2=收回控制权(participant
Integer oprType = ControlHolderTypeEnum.OWNER.getItemValue().equals(newHolderType) ? 1 : 2; Integer oprType = ControlHolderTypeEnum.OWNER.getItemValue().equals(newHolderType) ? 1 : 2;
req.setOprType(oprType); req.setOprType(oprType);
log.info("【控制权切换】操作类型: {}", oprType); log.info("【控制权切换】操作类型: {}", oprType);
...@@ -572,16 +573,29 @@ public class CoWebSocketServer { ...@@ -572,16 +573,29 @@ public class CoWebSocketServer {
return; return;
} }
// 广播控制权变更消息给房间内所有用户(包括自己) // 重新从 Redis(或数据库)获取最新的控制者信息,确保准确性
broadcast(roomId, message, session); // 因为服务层已经更新了控制权,此时 Redis 中的值是最新的
log.info("【控制权切换】广播消息已发送"); RoomRedisInfoDTO latest = sessionService.getCurrentController(roomId);
String correctHolderType = latest.getControlHolderType();
String correctHolderId = latest.getControlHolderId();
log.info("【控制权切换】最新控制者: holderType={}, holderId={}", correctHolderType, correctHolderId);
// 构造包含正确 holderId 的广播消息,避免前端因空 ID 无法匹配
String correctMsg = String.format(
"{\"action\":\"control_transfer\",\"holderType\":\"%s\",\"holderId\":\"%s\"}",
correctHolderType, correctHolderId
);
// 广播正确的控制权变更消息给房间内所有用户(包括自己,以便本端也能更新状态)
broadcast(roomId, correctMsg, session);
log.info("【控制权切换】已广播正确的控制权消息: {}", correctMsg);
// 记录操作日志(用于合规审计) // 记录操作日志(用于合规审计)
if (bizId != null) { if (bizId != null) {
operationLogService.log(bizId, userId, userType, userId, action, message, null, null); operationLogService.log(bizId, userId, userType, userId, action, correctMsg, null, null);
} }
log.info("控制权切换成功: roomId={}, holder={}:{}", roomId, newHolderType, newHolderId); log.info("控制权切换成功: roomId={}, holder={}:{}", roomId, correctHolderType, correctHolderId);
return; return;
} }
......
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