AppPcBindSocketIo.java 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  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. //这里判断得到三个人
  102. Set<String> notarys = getBindNotary(businessNo);
  103. if (CollectionUtils.isEmpty(notarys)) {
  104. // 直接删除这条数据
  105. delBusinessNo(businessNo);
  106. // TDOO 发送给app。取消了视频通话
  107. log.info("推送给app消息{}",businessNo);
  108. sendAppMsg(businessNo);
  109. } else {
  110. notarys.remove(username);
  111. // 保存没有取消的时间
  112. setNoCancelNotary(notarys, businessNo);
  113. }
  114. }
  115. public Set<String> getAllBindNotary() {
  116. List<String> keys = redisUtils.scan(PREFIX_BUSINESS_NO + "*");
  117. Set<String> set = new HashSet<>();
  118. for (String key : keys) {
  119. JSONArray json = JSON.parseArray((String) redisUtils.get(key));
  120. for (int i = 0; i < json.size(); i++) {
  121. JSONObject jsonObj = json.getJSONObject(i);
  122. String username = jsonObj.getString("userName");
  123. set.add(username);
  124. }
  125. }
  126. return set;
  127. }
  128. public Set<String> disconnectNotary(String notary) {
  129. List<String> keys = redisUtils.scan(PREFIX_BUSINESS_NO + "*");
  130. Set<String> set = new HashSet<>();
  131. // 先查询出业务编号
  132. String businessNo = "";
  133. for (String key : keys) {
  134. JSONArray json = JSON.parseArray((String) redisUtils.get(key));
  135. for (int i = 0; i < json.size(); i++) {
  136. JSONObject jsonObj = json.getJSONObject(i);
  137. String username = jsonObj.getString("userName");
  138. if (username.equalsIgnoreCase(notary))
  139. businessNo = key;
  140. }
  141. }
  142. log.info("app失去连接:{} ",businessNo);
  143. removeNotary(getBindNo(businessNo), notary);
  144. // String key = (String) redisUtils.get(PREFIX_BUSINESS_NO + businessNo);
  145. // JSONArray json = JSON.parseArray((String) redisUtils.get(key));
  146. return set;
  147. }
  148. public String getBindNo(String businessNo) {
  149. if (businessNo.contains(PREFIX_BUSINESS_NO)) {
  150. return businessNo.substring(PREFIX_BUSINESS_NO.length());
  151. }
  152. return businessNo;
  153. }
  154. public void socketIoTime(String socketId, String json) {
  155. redisUtils.set(socketId, json, 60 * 5);
  156. }
  157. public List<JSONObject> socketIoTime(String socketId) {
  158. String json = (String) redisUtils.get(socketId);
  159. List<JSONObject> jsonObj = JSONObject.parseArray(json, JSONObject.class);
  160. return jsonObj;
  161. }
  162. public static void main(String[] args) {
  163. String str = "business-no-10020221102110257621".substring(PREFIX_BUSINESS_NO.length());
  164. System.out.println(str);
  165. }
  166. }