AppPcBindSocketIo.java 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. package me.zhengjie.base.websocket;
  2. import java.util.ArrayList;
  3. import java.util.HashMap;
  4. import java.util.HashSet;
  5. import java.util.List;
  6. import java.util.Set;
  7. import java.util.UUID;
  8. import org.apache.commons.collections4.CollectionUtils;
  9. import org.apache.commons.collections4.MapUtils;
  10. import org.apache.commons.lang3.StringUtils;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.stereotype.Component;
  13. import com.alibaba.fastjson.JSON;
  14. import com.alibaba.fastjson.JSONArray;
  15. import com.alibaba.fastjson.JSONObject;
  16. import com.corundumstudio.socketio.SocketIOClient;
  17. import lombok.extern.slf4j.Slf4j;
  18. import me.zhengjie.application.admin.controller.OrderRoomIdController;
  19. import me.zhengjie.utils.RedisUtils;
  20. /**
  21. *
  22. * @author auas
  23. *
  24. */
  25. @Component
  26. @Slf4j
  27. public class AppPcBindSocketIo {
  28. public final static String PREFIX_BUSINESS_NO = "business-no-";
  29. @Autowired
  30. RedisUtils redisUtils;
  31. /**
  32. *
  33. * @param businessNo
  34. * @param json
  35. * @param time 时间单位秒
  36. */
  37. public void setBusinessNo(String businessNo, String json, long time) {
  38. redisUtils.set(PREFIX_BUSINESS_NO + businessNo, json, time);
  39. }
  40. /**
  41. * 这里是便于删除他继续测试使用
  42. *
  43. * @param businessNo
  44. * @param json
  45. * @param time
  46. */
  47. public void delBusinessNo(String businessNo) {
  48. redisUtils.del(PREFIX_BUSINESS_NO + businessNo);
  49. }
  50. /**
  51. * 得到过期时间
  52. *
  53. * @param key
  54. * @return
  55. */
  56. public long getExpire(Object key) {
  57. return redisUtils.getExpire(PREFIX_BUSINESS_NO + key);
  58. }
  59. /**
  60. * 设置没有取消的值进行判断
  61. *
  62. * @param businessNo
  63. * @return
  64. */
  65. public void setNoCancelNotary(Set<String> notarys, String businessNo) {
  66. List<JSONObject> bindNotarys = new ArrayList<>();
  67. for (String userName : notarys) {
  68. JSONObject jsonObj = new JSONObject();
  69. jsonObj.put("userName", userName);
  70. bindNotarys.add(jsonObj);
  71. }
  72. String notaryJson = JSONObject.toJSONString(bindNotarys);
  73. setBusinessNo(businessNo, notaryJson, getExpire(businessNo));
  74. }
  75. public Set<String> getBindNotary(String businessNo) {
  76. Set<String> userNames = new HashSet<>();
  77. String key = (String) redisUtils.get(PREFIX_BUSINESS_NO + businessNo);
  78. if (StringUtils.isEmpty(key)) {
  79. return userNames;
  80. }
  81. JSONArray json = JSON.parseArray(key);
  82. for (int i = 0; i < json.size(); i++) {
  83. JSONObject jsonObj = json.getJSONObject(i);
  84. String username = jsonObj.getString("userName");
  85. userNames.add(username);
  86. }
  87. return userNames;
  88. }
  89. private void sendAppMsg(String businessNo) {
  90. HashMap<UUID, SocketIOClient> appSocketIo = AppSocketClientCache.getAppUserClient(businessNo);
  91. if (MapUtils.isNotEmpty(appSocketIo)) {
  92. appSocketIo.forEach((uuid, socketIOClient) -> {
  93. socketIOClient.sendEvent("cancelEvent", "cancel");
  94. });
  95. }
  96. }
  97. public void removeNotary(String businessNo, String username) {
  98. if (StringUtils.isBlank(businessNo)) {
  99. return;
  100. }
  101. Set<String> notarys = getBindNotary(businessNo);
  102. if (CollectionUtils.isEmpty(notarys) || notarys.size() == 1) {
  103. // 直接删除这条数据
  104. delBusinessNo(businessNo);
  105. // TDOO 发送给app。取消了视频通话
  106. log.info("推送给app消息{}",businessNo);
  107. sendAppMsg(businessNo);
  108. } else {
  109. notarys.remove(username);
  110. // 保存没有取消的时间
  111. setNoCancelNotary(notarys, businessNo);
  112. }
  113. }
  114. public Set<String> getAllBindNotary() {
  115. List<String> keys = redisUtils.scan(PREFIX_BUSINESS_NO + "*");
  116. Set<String> set = new HashSet<>();
  117. for (String key : keys) {
  118. JSONArray json = JSON.parseArray((String) redisUtils.get(key));
  119. for (int i = 0; i < json.size(); i++) {
  120. JSONObject jsonObj = json.getJSONObject(i);
  121. String username = jsonObj.getString("userName");
  122. set.add(username);
  123. }
  124. }
  125. return set;
  126. }
  127. public Set<String> disconnectNotary(String notary) {
  128. List<String> keys = redisUtils.scan(PREFIX_BUSINESS_NO + "*");
  129. Set<String> set = new HashSet<>();
  130. // 先查询出业务编号
  131. String businessNo = "";
  132. for (String key : keys) {
  133. JSONArray json = JSON.parseArray((String) redisUtils.get(key));
  134. for (int i = 0; i < json.size(); i++) {
  135. JSONObject jsonObj = json.getJSONObject(i);
  136. String username = jsonObj.getString("userName");
  137. if (username.equalsIgnoreCase(notary))
  138. businessNo = key;
  139. }
  140. }
  141. log.info("app失去连接:{} ",businessNo);
  142. removeNotary(getBindNo(businessNo), notary);
  143. // String key = (String) redisUtils.get(PREFIX_BUSINESS_NO + businessNo);
  144. // JSONArray json = JSON.parseArray((String) redisUtils.get(key));
  145. return set;
  146. }
  147. public String getBindNo(String businessNo) {
  148. if (businessNo.contains(PREFIX_BUSINESS_NO)) {
  149. return businessNo.substring(PREFIX_BUSINESS_NO.length());
  150. }
  151. return businessNo;
  152. }
  153. public void socketIoTime(String socketId, String json) {
  154. redisUtils.set(socketId, json, 60 * 5);
  155. }
  156. public List<JSONObject> socketIoTime(String socketId) {
  157. String json = (String) redisUtils.get(socketId);
  158. List<JSONObject> jsonObj = JSONObject.parseArray(json, JSONObject.class);
  159. return jsonObj;
  160. }
  161. public static void main(String[] args) {
  162. String str = "business-no-10020221102110257621".substring(PREFIX_BUSINESS_NO.length());
  163. System.out.println(str);
  164. }
  165. }