WebSocket.java 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477
  1. package jnpf.message.websocket;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.google.common.collect.ImmutableMap;
  4. import jnpf.base.PageModel;
  5. import jnpf.base.UserInfo;
  6. import jnpf.base.service.SysconfigService;
  7. import jnpf.config.ConfigValueUtil;
  8. import jnpf.database.util.TenantDataSourceUtil;
  9. import jnpf.message.entity.MessageReceiveEntity;
  10. import jnpf.message.service.UserDeviceService;
  11. import jnpf.message.util.*;
  12. import jnpf.message.util.unipush.UinPush;
  13. import jnpf.message.entity.ImContentEntity;
  14. import jnpf.message.entity.MessageEntity;
  15. import jnpf.message.model.message.PaginationMessage;
  16. import jnpf.message.model.websocket.onconnettion.OnConnectionModel;
  17. import jnpf.message.model.websocket.onconnettion.OnLineModel;
  18. import jnpf.message.model.websocket.receivemessage.ReceiveMessageModel;
  19. import jnpf.message.model.websocket.savafile.ImageMessageModel;
  20. import jnpf.message.model.websocket.savafile.VoiceMessageModel;
  21. import jnpf.message.model.websocket.savamessage.SavaMessageModel;
  22. import jnpf.message.service.ImContentService;
  23. import jnpf.message.service.MessageService;
  24. import jnpf.message.model.ImUnreadNumModel;
  25. import jnpf.model.BaseSystemInfo;
  26. import jnpf.permission.entity.UserEntity;
  27. import jnpf.permission.service.UserService;
  28. import jnpf.util.*;
  29. import jnpf.util.JsonUtil;
  30. import jnpf.util.context.SpringContext;
  31. import lombok.extern.slf4j.Slf4j;
  32. import org.springframework.context.annotation.Scope;
  33. import org.springframework.stereotype.Component;
  34. import jakarta.websocket.*;
  35. import jakarta.websocket.server.PathParam;
  36. import jakarta.websocket.server.ServerEndpoint;
  37. import java.util.*;
  38. import java.util.stream.Collectors;
  39. /**
  40. * 消息聊天
  41. *
  42. * @author JNPF开发平台组
  43. * @version V3.1.0
  44. * @copyright 引迈信息技术有限公司
  45. * @date 2019年9月26日 上午9:18
  46. */
  47. @Slf4j
  48. @Component
  49. @ServerEndpoint(value = "/api/message/websocket/{token}")
  50. @Scope("prototype")
  51. public class WebSocket {
  52. private ImContentService imContentService;
  53. private MessageService messageService;
  54. private ConfigValueUtil configValueUtil;
  55. private UserInfo userInfo;
  56. private UserService userApi;
  57. private SysconfigService sysConfigApi;
  58. private UinPush uinPush;
  59. private UserDeviceService userDeviceService;
  60. /**
  61. * 连接建立成功调用的方法
  62. */
  63. @OnOpen
  64. public void onOpen(Session session, @PathParam("token") String token) {
  65. this.init();
  66. this.userInfo = UserProvider.getUser(token);
  67. if (this.userInfo.getUserId() == null) {
  68. try{
  69. OnlineUserProvider.closeFrontWs(null, session);
  70. session.close();
  71. }catch (Exception e){}
  72. log.info("WS建立链接, TOKEN无效:{}, {}", session.getId(), token);
  73. }else {
  74. log.info("WS建立链接:{}, {}", session.getId(), token);
  75. }
  76. }
  77. /**
  78. * 连接关闭调用的方法
  79. */
  80. @OnClose
  81. public void onClose(Session session) {
  82. OnlineUserModel user = OnlineUserProvider.getOnlineUserList().stream().filter(t -> t.getConnectionId().equals(session.getId())).findFirst().orElse(null);
  83. if (user != null) {
  84. OnlineUserProvider.removeWebSocketByToken(user.getToken());
  85. log.info("WS连接断开: {}, {}, {}, {}", user.getTenantId(), user.getUserId(), session.getId(), user.getToken());
  86. }else{
  87. log.debug("WS连接断开, 无用户信息: {}", session.getId());
  88. }
  89. }
  90. /**
  91. * 收到客户端消息后调用的方法
  92. *
  93. * @param message 客户端发送过来的消息
  94. */
  95. @OnMessage
  96. public void onMessage(String message, Session session) {
  97. try{
  98. processMessage(message, session);
  99. }finally {
  100. //多租户切换后清除缓存
  101. UserProvider.clearLocalUser();
  102. TenantDataSourceUtil.clearLocalTenantInfo();
  103. }
  104. }
  105. private void processMessage(String message, Session session){
  106. log.debug("WS消息内容: {}, {}", session.getId(), message);
  107. JSONObject receivedMessage = JSONObject.parseObject(message);
  108. String receivedMethod = receivedMessage.getString(MessageParameterEnum.PARAMETER_METHOD.getValue());
  109. String receivedToken = receivedMessage.getString(MessageParameterEnum.PARAMETER_TOKEN.getValue());
  110. //验证TOKEN
  111. this.userInfo = UserProvider.getUser(receivedMessage.getString(MessageParameterEnum.PARAMETER_TOKEN.getValue()));
  112. if (this.userInfo.getUserId() == null) {
  113. log.info("WSToken无效: {}, {}", session.getId(), message);
  114. OnlineUserProvider.closeFrontWs(null, session);
  115. return;
  116. }
  117. //判断是否为多租户
  118. if(!isMultiTenancy()){
  119. log.info("WS切库失败: {}, {}, {}, {}", userInfo.getTenantId(), userInfo.getUserId(), session.getId(), receivedToken);
  120. //切库失败
  121. OnlineUserProvider.closeFrontWs(null, session);
  122. }
  123. UserProvider.setLocalLoginUser(userInfo);
  124. switch (receivedMethod) {
  125. case ConnectionType.CONNECTION_ONCONNECTION:
  126. //建立连接
  127. log.info("WS开启连接: {}, {}, {}, {}", userInfo.getTenantId(), userInfo.getUserId(), session.getId(), receivedToken);
  128. if(OnlineUserProvider.getOnlineUserList().stream().anyMatch(t -> t.getWebSocket().getId().equals(session.getId()))){
  129. //WS已存在
  130. log.info("WS已存在: {}, {}, {}, {}", userInfo.getTenantId(), userInfo.getUserId(), session.getId(), receivedToken);
  131. return;
  132. }
  133. //Token已存在, 关闭之前的WebSocket, 继续执行后续代码添加新的WebSocket
  134. List<OnlineUserModel> tokenList = OnlineUserProvider.getOnlineUserList().stream().filter(t-> {
  135. if(receivedToken.equals(t.getToken())){
  136. OnlineUserProvider.closeFrontWs(t, t.getWebSocket());
  137. return true;
  138. }
  139. return false;
  140. }).collect(Collectors.toList());
  141. OnlineUserProvider.getOnlineUserList().removeAll(tokenList);
  142. //app-true, PC-false
  143. Boolean isMobileDevice = receivedMessage.getBoolean(MessageParameterEnum.PARAMETER_MOBILEDEVICE.getValue());
  144. if (userInfo != null && userInfo.getUserId() != null) {
  145. OnlineUserModel model = new OnlineUserModel();
  146. model.setConnectionId(session.getId());
  147. model.setUserId(userInfo.getUserId());
  148. model.setTenantId(userInfo.getTenantId());
  149. model.setIsMobileDevice(isMobileDevice);
  150. model.setWebSocket(session);
  151. model.setToken(receivedToken);
  152. model.setSystemId(model.getIsMobileDevice() ? userInfo.getAppSystemId() : userInfo.getSystemId());
  153. BaseSystemInfo sysInfo = sysConfigApi.getSysInfo();
  154. //判断是否在线
  155. isOnLine(sysInfo, model);
  156. List<OnlineUserModel> onlineUserList = OnlineUserProvider.getOnlineUserList().stream().filter(q -> !q.getUserId().equals(userInfo.getUserId()) && q.getTenantId().equals(userInfo.getTenantId())).collect(Collectors.toList());
  157. //反馈信息给登录者
  158. List<String> onlineUsers = onlineUserList.stream().map(t -> t.getUserId()).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());
  159. List<ImUnreadNumModel> unreadNums = imContentService.getUnreadList(userInfo.getUserId());
  160. int unreadNoticeCount = messageService.getUnreadCount(userInfo.getUserId(), 1);
  161. int unreadMessageCount = messageService.getUnreadCount(userInfo.getUserId(), 2);
  162. int unreadScheduleCount = messageService.getUnreadCount(userInfo.getUserId(),4);
  163. int unreadSystemMessageCount = messageService.getUnreadCount(userInfo.getUserId(), 3);
  164. MessageEntity noticeDefaultText = messageService.getInfoDefault(1);
  165. PaginationMessage pagination = new PaginationMessage();
  166. pagination.setCurrentPage(1);
  167. pagination.setPageSize(1);
  168. pagination.setUserId(userInfo.getUserId());
  169. List<MessageReceiveEntity> list = messageService.getMessageList3(pagination);
  170. MessageReceiveEntity messageDefaultText = new MessageReceiveEntity();
  171. if(list.size()>0){
  172. messageDefaultText = list.get(0);
  173. }
  174. String noticeText = noticeDefaultText.getTitle() != null ? noticeDefaultText.getTitle() : "";
  175. String messageText = messageDefaultText.getTitle() != null ? messageDefaultText.getTitle() : "";
  176. Long noticeTime = noticeDefaultText.getCreatorTime() != null ? noticeDefaultText.getCreatorTime().getTime() : 0;
  177. Long messageTime = messageDefaultText.getCreatorTime() != null ? messageDefaultText.getCreatorTime().getTime() : 0;
  178. //转model后上传到mq服务器上
  179. OnConnectionModel onConnectionModel = new OnConnectionModel();
  180. onConnectionModel.setMethod(MessageChannelType.CHANNEL_INITMESSAGE);
  181. onConnectionModel.setOnlineUsers(onlineUsers);
  182. onConnectionModel.setUnreadNums(JsonUtil.listToJsonField(unreadNums));
  183. onConnectionModel.setUnreadNoticeCount(unreadNoticeCount);
  184. // onConnectionModel.setNoticeDefaultText(noticeText);
  185. onConnectionModel.setUnreadMessageCount(unreadMessageCount);
  186. onConnectionModel.setUnreadSystemMessageCount(unreadSystemMessageCount);
  187. onConnectionModel.setUnreadScheduleCount(unreadScheduleCount);
  188. onConnectionModel.setMessageDefaultText(messageText);
  189. onConnectionModel.setMessageDefaultTime(messageTime);
  190. onConnectionModel.setUserId(userInfo.getUserId());
  191. int total = unreadNoticeCount+unreadMessageCount+unreadSystemMessageCount+unreadScheduleCount;
  192. onConnectionModel.setUnreadTotalCount(total);
  193. OnlineUserProvider.sendMessage(session, onConnectionModel);
  194. //通知所有在线用户,有用户在线
  195. for (OnlineUserModel item : onlineUserList) {
  196. if (!item.getUserId().equals(userInfo.getUserId())) {
  197. //创建模型
  198. OnLineModel remindUserModel = new OnLineModel(MessageChannelType.CHANNEL_ONLINE, userInfo.getUserId());
  199. OnlineUserProvider.sendMessage(item, remindUserModel);
  200. }
  201. }
  202. }
  203. break;
  204. case ConnectionType.CONNECTION_SENDMESSAGE:
  205. //发送消息
  206. String toUserId = receivedMessage.getString(MessageParameterEnum.PARAMETER_TOUSERID.getValue());
  207. //text/voice/image
  208. String messageType = receivedMessage.getString(MessageParameterEnum.PARAMETER_MESSAGETYPE.getValue());
  209. String messageContent = receivedMessage.getString(MessageParameterEnum.PARAMETER_MESSAGECONTENT.getValue());
  210. String tenantId = UserProvider.getUser(receivedMessage.getString(MessageParameterEnum.PARAMETER_TOKEN.getValue())).getTenantId();
  211. String fileName = "";
  212. if (!SendMessageTypeEnum.MESSAGE_TEXT.getMessage().equals(messageType)) {
  213. JSONObject object = JSONObject.parseObject(messageContent);
  214. fileName = object.getString("name");
  215. }
  216. List<OnlineUserModel> user = OnlineUserProvider.getOnlineUserList().stream().filter(q -> String.valueOf(q.getUserId()).equals(String.valueOf(userInfo.getUserId())) && String.valueOf(q.getTenantId()).equals(tenantId)).collect(Collectors.toList());
  217. OnlineUserModel onlineUser = user.size() > 0 ? user.get(0) : null;
  218. List<OnlineUserModel> toUser = OnlineUserProvider.getOnlineUserList().stream().filter(q -> String.valueOf(q.getTenantId()).equals(String.valueOf(onlineUser.getTenantId())) && String.valueOf(q.getUserId()).equals(String.valueOf(toUserId))).collect(Collectors.toList());
  219. if (user.size() != 0) {
  220. //saveMessage
  221. if (SendMessageTypeEnum.MESSAGE_TEXT.getMessage().equals(messageType)) {
  222. messageContent = XSSEscape.escape(messageContent);
  223. imContentService.sendMessage(onlineUser.getUserId(), toUserId, messageContent, messageType);
  224. } else if (SendMessageTypeEnum.MESSAGE_IMAGE.getMessage().equals(messageType)) {
  225. JSONObject image = new JSONObject();
  226. image.put("path", UploaderUtil.uploaderImg("/api/file/Image/IM/", fileName));
  227. image.put("width", JSONObject.parseObject(messageContent).getString("width"));
  228. image.put("height", JSONObject.parseObject(messageContent).getString("height"));
  229. imContentService.sendMessage(onlineUser.getUserId(), toUserId, image.toJSONString(), messageType);
  230. } else if (SendMessageTypeEnum.MESSAGE_VOICE.getMessage().equals(messageType)) {
  231. JSONObject voice = new JSONObject();
  232. voice.put("path", UploaderUtil.uploaderImg("/api/file/Image/IM/", fileName));
  233. voice.put("length", JSONObject.parseObject(messageContent).getString("length"));
  234. imContentService.sendMessage(onlineUser.getUserId(), toUserId, voice.toJSONString(), messageType);
  235. }
  236. for (int i = 0; i < user.size(); i++) {
  237. OnlineUserModel model = user.get(i);
  238. //组装model
  239. SavaMessageModel savaMessageModel = new SavaMessageModel();
  240. savaMessageModel.setMethod(MessageChannelType.CHANNEL_SENDMESSAGE);
  241. savaMessageModel.setUserId(model.getUserId());
  242. savaMessageModel.setToUserId(toUserId);
  243. savaMessageModel.setDateTime(DateUtil.getNowDate().getTime());
  244. //头像
  245. savaMessageModel.setHeadIcon(UploaderUtil.uploaderImg(userInfo.getUserIcon()));
  246. //最新消息
  247. savaMessageModel.setLatestDate(DateUtil.getNowDate().getTime());
  248. //用户姓名
  249. savaMessageModel.setRealName(userInfo.getUserName());
  250. savaMessageModel.setAccount(userInfo.getUserAccount());
  251. //对方的名称账号头像
  252. Map<String, String> headers = ImmutableMap.of(Constants.AUTHORIZATION.toLowerCase(), receivedToken);
  253. UserEntity entity = userApi.getInfo(toUserId);
  254. savaMessageModel.setToAccount(entity.getAccount());
  255. savaMessageModel.setToRealName(entity.getRealName());
  256. savaMessageModel.setToHeadIcon(UploaderUtil.uploaderImg(entity.getHeadIcon()));
  257. if (SendMessageTypeEnum.MESSAGE_TEXT.getMessage().equals(messageType)) {
  258. savaMessageModel.setMessageType(messageType);
  259. savaMessageModel.setToMessage(messageContent);
  260. } else if (SendMessageTypeEnum.MESSAGE_IMAGE.getMessage().equals(messageType)) {
  261. //构建图片模型
  262. ImageMessageModel messageModel = getImageModel(messageContent, UploaderUtil.uploaderImg("/api/file/Image/IM/", fileName));
  263. savaMessageModel.setToMessage(messageModel);
  264. savaMessageModel.setMessageType(messageType);
  265. } else if (SendMessageTypeEnum.MESSAGE_VOICE.getMessage().equals(messageType)) {
  266. //构建语音模型
  267. VoiceMessageModel messageModel = getVoiceMessageModel(messageContent, UploaderUtil.uploaderImg("/api/file/Image/IM/", fileName));
  268. savaMessageModel.setMessageType(messageType);
  269. savaMessageModel.setToMessage(messageModel);
  270. }
  271. /*List<String> cidList = userDeviceService.getCidList(toUserId);
  272. if(cidList != null && cidList.size()>0){
  273. JSONObject jsonObject = new JSONObject();
  274. jsonObject.put("type","3");
  275. jsonObject.put("name",userInfo.getUserName() + "/"+userInfo.getUserAccount());
  276. jsonObject.put("formUserId",userInfo.getUserId());
  277. jsonObject.put("headIcon",UploaderUtil.uploaderImg(userInfo.getUserIcon()));
  278. // jsonObject.put("title",userInfo.getUserName() + "/"+userInfo.getUserAccount());
  279. String text = JSONObject.toJSONString(jsonObject);
  280. byte[] bytes = text.getBytes(StandardCharsets.UTF_8);
  281. text = Base64.getEncoder().encodeToString(bytes);
  282. uinPush.sendUniPush(cidList, userInfo.getUserName(), "你有一条看聊天消息", "3", text);
  283. }*/
  284. OnlineUserProvider.sendMessage(model, savaMessageModel);
  285. }
  286. }
  287. //接受消息
  288. ReceiveMessageModel receiveMessageModel = new ReceiveMessageModel();
  289. receiveMessageModel.setMethod(MessageChannelType.CHANNEL_RECEIVEMESSAGE);
  290. receiveMessageModel.setFormUserId(onlineUser.getUserId());
  291. receiveMessageModel.setDateTime(DateUtil.getNowDate().getTime());
  292. //头像
  293. receiveMessageModel.setHeadIcon(UploaderUtil.uploaderImg(userInfo.getUserIcon()));
  294. //最新消息
  295. receiveMessageModel.setLatestDate(DateUtil.getNowDate().getTime());
  296. //用户姓名
  297. receiveMessageModel.setRealName(userInfo.getUserName());
  298. receiveMessageModel.setAccount(userInfo.getUserAccount());
  299. receiveMessageModel.setUserId(toUserId);
  300. if (toUser.size() != 0) {
  301. for (int i = 0; i < toUser.size(); i++) {
  302. OnlineUserModel onlineToUser = toUser.get(i);
  303. if (SendMessageTypeEnum.MESSAGE_TEXT.getMessage().equals(messageType)) {
  304. receiveMessageModel.setMessageType(messageType);
  305. receiveMessageModel.setFormMessage(messageContent);
  306. } else if (SendMessageTypeEnum.MESSAGE_IMAGE.getMessage().equals(messageType)) {
  307. //构建图片模型
  308. ImageMessageModel messageModel = getImageModel(messageContent, UploaderUtil.uploaderImg("/api/file/Image/IM/", fileName));
  309. receiveMessageModel.setMessageType(messageType);
  310. receiveMessageModel.setFormMessage(messageModel);
  311. } else if (SendMessageTypeEnum.MESSAGE_VOICE.getMessage().equals(messageType)) {
  312. //构建语音模型
  313. VoiceMessageModel messageModel = getVoiceMessageModel(messageContent, UploaderUtil.uploaderImg("/api/file/Image/IM/", fileName));
  314. receiveMessageModel.setMessageType(messageType);
  315. receiveMessageModel.setFormMessage(messageModel);
  316. }
  317. OnlineUserProvider.sendMessage(onlineToUser, receiveMessageModel);
  318. }
  319. }
  320. break;
  321. case "UpdateReadMessage":
  322. //更新已读
  323. String formUserId = receivedMessage.getString("formUserId");
  324. onlineUser = OnlineUserProvider.getOnlineUserList().stream().filter(q -> String.valueOf(q.getConnectionId()).equals(String.valueOf(session.getId()))).findFirst().orElse(new OnlineUserModel());
  325. if (onlineUser != null) {
  326. imContentService.readMessage(formUserId, onlineUser.getUserId());
  327. }
  328. break;
  329. case "MessageList":
  330. //获取消息列表
  331. String sendUserId = receivedMessage.getString("toUserId");
  332. String receiveUserId = receivedMessage.getString("formUserId");
  333. PageModel pageModel = new PageModel();
  334. pageModel.setPage(receivedMessage.getInteger("currentPage"));
  335. pageModel.setRows(receivedMessage.getInteger("pageSize"));
  336. pageModel.setSord(receivedMessage.getString("sort"));
  337. pageModel.setKeyword(receivedMessage.getString("keyword"));
  338. List<ImContentEntity> data = imContentService.getMessageList(sendUserId, receiveUserId, pageModel).stream().sorted(Comparator.comparing(ImContentEntity::getSendTime)).collect(Collectors.toList());
  339. JSONObject object = new JSONObject();
  340. object.put("method", "messageList");
  341. object.put("list", JsonUtil.getListToJsonArray(data));
  342. JSONObject pagination = new JSONObject();
  343. pagination.put("total", pageModel.getRecords());
  344. pagination.put("currentPage", pageModel.getPage());
  345. pagination.put("pageSize", receivedMessage.getInteger("pageSize"));
  346. object.put("pagination", pagination);
  347. OnlineUserProvider.sendMessage(session, object);
  348. break;
  349. default:
  350. break;
  351. }
  352. }
  353. /**
  354. * 判断是否在线
  355. *
  356. * @param model
  357. */
  358. private void isOnLine(BaseSystemInfo systemInfo, OnlineUserModel model) {
  359. // 不允许多人登录
  360. if ("1".equals(String.valueOf(systemInfo.getSingleLogin()))) {
  361. Long userAll = OnlineUserProvider.getOnlineUserList().stream().filter(t -> t.getUserId().equals(userInfo.getUserId()) && t.getTenantId().equals(userInfo.getTenantId())).count();
  362. Long userAllMobile = OnlineUserProvider.getOnlineUserList().stream().filter(t -> t.getUserId().equals(userInfo.getUserId()) && t.getTenantId().equals(userInfo.getTenantId()) && t.getIsMobileDevice().equals(true)).count();
  363. Long userAllWeb = OnlineUserProvider.getOnlineUserList().stream().filter(t -> t.getUserId().equals(userInfo.getUserId()) && t.getTenantId().equals(userInfo.getTenantId()) && t.getIsMobileDevice().equals(false)).count();
  364. //都不在线
  365. if (userAll == 0) {
  366. OnlineUserProvider.addModel(model);
  367. }
  368. //手机在线
  369. else if (userAllMobile != 0 && userAllWeb == 0) {
  370. if (!model.getIsMobileDevice()) {
  371. OnlineUserProvider.addModel(model);
  372. }
  373. }
  374. //电脑在线
  375. else {
  376. if (model.getIsMobileDevice()) {
  377. OnlineUserProvider.addModel(model);
  378. }
  379. }
  380. } else {
  381. //同时登录不限制
  382. OnlineUserProvider.addModel(model);
  383. }
  384. }
  385. /**
  386. * 判断是否为多租户
  387. *
  388. */
  389. private boolean isMultiTenancy() {
  390. if (configValueUtil.isMultiTenancy()) {
  391. //多租户需要切库
  392. if (StringUtil.isNotEmpty(userInfo.getTenantId())) {
  393. TenantDataSourceUtil.switchTenant(userInfo.getTenantId());
  394. }else{
  395. return false;
  396. }
  397. }
  398. return true;
  399. }
  400. /**
  401. * 构建图片消息模型
  402. *
  403. * @param messageContent
  404. * @param fileName
  405. * @return
  406. */
  407. private ImageMessageModel getImageModel(String messageContent, String fileName) {
  408. String width = JSONObject.parseObject(messageContent).getString("width");
  409. String height = JSONObject.parseObject(messageContent).getString("height");
  410. return new ImageMessageModel(width, height, fileName);
  411. }
  412. /**
  413. * 构建语音模型
  414. *
  415. * @param messageContent
  416. * @param fileName
  417. * @return
  418. */
  419. private VoiceMessageModel getVoiceMessageModel(String messageContent, String fileName) {
  420. String length = JSONObject.parseObject(messageContent).getString("length");
  421. return new VoiceMessageModel(length, fileName);
  422. }
  423. @OnError
  424. public void onError(Session session, Throwable error) {
  425. // OnlineUserModel user = OnlineUserProvider.getOnlineUserList().stream().filter(t -> t.getConnectionId().equals(session.getId())).findFirst().isPresent() ? OnlineUserProvider.getOnlineUserList().stream().filter(t -> t.getConnectionId().equals(session.getId())).findFirst().get() : null;
  426. // if (user != null) {
  427. // log.error("调用onError,租户:" + user.getTenantId() + ",用户:" + user.getUserId());
  428. // }
  429. try {
  430. onClose(session);
  431. } catch (Exception e) {
  432. // log.error("发生error,调用onclose失败,session为:" + session);
  433. }
  434. if (error.getMessage() != null) {
  435. OnlineUserModel user = OnlineUserProvider.getOnlineUserList().stream().filter(t -> t.getConnectionId().equals(session.getId())).findFirst().isPresent() ? OnlineUserProvider.getOnlineUserList().stream().filter(t -> t.getConnectionId().equals(session.getId())).findFirst().get() : null;
  436. if(user != null){
  437. log.error("WS发生错误: {}, {}, {}, {}, {}", user.getTenantId(), user.getUserId(), session.getId(), error.getMessage(), user.getToken());
  438. }else{
  439. log.error("WS发生错误", error);
  440. }
  441. }
  442. }
  443. /**
  444. * 初始化
  445. */
  446. private void init() {
  447. messageService = SpringContext.getBean(MessageService.class);
  448. imContentService = SpringContext.getBean(ImContentService.class);
  449. configValueUtil = SpringContext.getBean(ConfigValueUtil.class);
  450. userApi = SpringContext.getBean(UserService.class);
  451. sysConfigApi = SpringContext.getBean(SysconfigService.class);
  452. uinPush = SpringContext.getBean(UinPush.class);
  453. userDeviceService = SpringContext.getBean(UserDeviceService.class);
  454. }
  455. }