package me.zhengjie.base.websocket; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.UUID; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.corundumstudio.socketio.SocketIOClient; import lombok.extern.slf4j.Slf4j; import me.zhengjie.application.admin.controller.OrderRoomIdController; import me.zhengjie.utils.RedisUtils; /** * * @author auas * */ @Component @Slf4j public class AppPcBindSocketIo { public final static String PREFIX_BUSINESS_NO = "business-no-"; @Autowired RedisUtils redisUtils; /** * * @param businessNo * @param json * @param time 时间单位秒 */ public void setBusinessNo(String businessNo, String json, long time) { redisUtils.set(PREFIX_BUSINESS_NO + businessNo, json, time); } /** * 这里是便于删除他继续测试使用 * * @param businessNo * @param json * @param time */ public void delBusinessNo(String businessNo) { redisUtils.del(PREFIX_BUSINESS_NO + businessNo); } /** * 得到过期时间 * * @param key * @return */ public long getExpire(Object key) { return redisUtils.getExpire(PREFIX_BUSINESS_NO + key); } /** * 设置没有取消的值进行判断 * * @param businessNo * @return */ public void setNoCancelNotary(Set notarys, String businessNo) { List bindNotarys = new ArrayList<>(); for (String userName : notarys) { JSONObject jsonObj = new JSONObject(); jsonObj.put("userName", userName); bindNotarys.add(jsonObj); } String notaryJson = JSONObject.toJSONString(bindNotarys); setBusinessNo(businessNo, notaryJson, getExpire(businessNo)); } public Set getBindNotary(String businessNo) { Set userNames = new HashSet<>(); String key = (String) redisUtils.get(PREFIX_BUSINESS_NO + businessNo); if (StringUtils.isEmpty(key)) { return userNames; } JSONArray json = JSON.parseArray(key); for (int i = 0; i < json.size(); i++) { JSONObject jsonObj = json.getJSONObject(i); String username = jsonObj.getString("userName"); userNames.add(username); } return userNames; } private void sendAppMsg(String businessNo) { HashMap appSocketIo = AppSocketClientCache.getAppUserClient(businessNo); if (MapUtils.isNotEmpty(appSocketIo)) { appSocketIo.forEach((uuid, socketIOClient) -> { socketIOClient.sendEvent("cancelEvent", "cancel"); }); } } public void removeNotary(String businessNo, String username) { if (StringUtils.isBlank(businessNo)) { return; } //这里判断得到三个人 Set notarys = getBindNotary(businessNo); if (CollectionUtils.isEmpty(notarys)) { // 直接删除这条数据 delBusinessNo(businessNo); // TDOO 发送给app。取消了视频通话 log.info("推送给app消息{}",businessNo); sendAppMsg(businessNo); } else { notarys.remove(username); // 保存没有取消的时间 setNoCancelNotary(notarys, businessNo); } } public Set getAllBindNotary() { List keys = redisUtils.scan(PREFIX_BUSINESS_NO + "*"); Set set = new HashSet<>(); for (String key : keys) { JSONArray json = JSON.parseArray((String) redisUtils.get(key)); for (int i = 0; i < json.size(); i++) { JSONObject jsonObj = json.getJSONObject(i); String username = jsonObj.getString("userName"); set.add(username); } } return set; } public Set disconnectNotary(String notary) { List keys = redisUtils.scan(PREFIX_BUSINESS_NO + "*"); Set set = new HashSet<>(); // 先查询出业务编号 String businessNo = ""; for (String key : keys) { JSONArray json = JSON.parseArray((String) redisUtils.get(key)); for (int i = 0; i < json.size(); i++) { JSONObject jsonObj = json.getJSONObject(i); String username = jsonObj.getString("userName"); if (username.equalsIgnoreCase(notary)) businessNo = key; } } log.info("app失去连接:{} ",businessNo); removeNotary(getBindNo(businessNo), notary); // String key = (String) redisUtils.get(PREFIX_BUSINESS_NO + businessNo); // JSONArray json = JSON.parseArray((String) redisUtils.get(key)); return set; } public String getBindNo(String businessNo) { if (businessNo.contains(PREFIX_BUSINESS_NO)) { return businessNo.substring(PREFIX_BUSINESS_NO.length()); } return businessNo; } public void socketIoTime(String socketId, String json) { redisUtils.set(socketId, json, 60 * 5); } public List socketIoTime(String socketId) { String json = (String) redisUtils.get(socketId); List jsonObj = JSONObject.parseArray(json, JSONObject.class); return jsonObj; } public static void main(String[] args) { String str = "business-no-10020221102110257621".substring(PREFIX_BUSINESS_NO.length()); System.out.println(str); } }