package com.zhujizheng.IHome.chat.net; import com.zhujizheng.IHome.chat.dto.PYRevokeChatDTO; import com.zhujizheng.IHome.chat.service.PYSingleChatService; import com.zhujizheng.IHome.chat.vo.*; import com.zhujizheng.IHome.util.alipush.AliPushService; import com.zhujizheng.IHome.websocket.Net.Base.NetProtocolBase; import com.zhujizheng.IHome.websocket.Net.exception.NetException; import com.zhujizheng.IHome.websocket.server.WebSocketServer; import lombok.extern.slf4j.Slf4j; import net.sf.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.concurrent.atomic.AtomicReference; @Slf4j @Component public class NetRevokeChat extends NetProtocolBase { @Autowired private PYSingleChatService service; @Autowired private AliPushService aliPushService; @Override public void dealWithJSONAndSid(JSONObject json, String sid) { super.dealWithJSONAndSid(json, sid); // 解析消息数据 PYRevokeChatDTO dto = (PYRevokeChatDTO)JSONObject.toBean(json, PYRevokeChatDTO.class); PYRevokeChatVO vo = new PYRevokeChatVO(); vo.setReceiveId(dto.getReceiveId()); // 设置回调结果的消息唯一标识符 vo.setMsgSeq(dto.getMsgSeq()); // 设置回调结果的消息状态默认为成功 vo.setStatus(1); PYRevokeChatAckVO ackVO = new PYRevokeChatAckVO(); ackVO.setMsgSeq(dto.getMsgSeq()); ackVO.setReceiveId(dto.getReceiveId()); ackVO.setSendId(Integer.parseInt(sid)); WebSocketServer item = WebSocketServer.getWebSocketMap().get(ackVO.getReceiveId().toString()); if (null == item) { // 离线推送 log.info("离线推送::ackVO.getReceiveId().toString() = " + ackVO.getReceiveId().toString()); aliPushService.pushRemoteNotify("新消息", "您收到一条聊天消息", ackVO.getReceiveId().toString(), ackVO.getSendId().toString(), 1); // 更新数据库 int result = service.revokeSingleChat(dto.getMsgSeq()); if (result == 0) { log.info("发送状态更新失败"); // 设置回调结果的消息状态为失败 vo.setStatus(0); this.sendObject(vo, sid); } else { // 给自己回调发送的结果,走到这一步才能确保消息发送成功 this.sendObject(vo, sid); } return; } // 给receiveId发送数据 NetRevokeChatAck ack = new NetRevokeChatAck(); // 设置即将发送的消息的消息状态为成功 ackVO.setStatus(1); AtomicReference sendSuccess = new AtomicReference<>(true); try { ack.sendObject(ackVO, ackVO.getReceiveId().toString()); } catch (NetException e) { log.info("删除消息失败"); e.printStackTrace(); sendSuccess.set(false); } finally { if (sendSuccess.get()) { log.info("删除消息成功"); // 更新数据库 int result = service.revokeSingleChat(dto.getMsgSeq()); if (result == 0) { log.info("发送状态更新失败"); // 设置回调结果的消息状态为失败 vo.setStatus(0); this.sendObject(vo, sid); } else { // 给自己回调发送的结果,走到这一步才能确保消息发送成功 this.sendObject(vo, sid); } } } } }