package com.kede.wechat.service.impl; import com.kede.common.dao.ChatMsgMapper; import com.kede.common.enums.WechatSmgTypeEnum; import com.kede.common.model.ChatMsg; import com.kede.common.model.ChatMsgUser; import com.kede.common.utils.DateUtils; import com.kede.common.utils.HttpUtils; import com.kede.common.utils.RSAEncrypt; import com.kede.common.utils.StringUtils; import com.kede.core.mybatis.BaseMybatisDao; import com.kede.wechat.bo.ChatMsgUserBo; import com.kede.wechat.bo.InputChatMsg; import com.kede.wechat.bo.InputGetChatName; import com.kede.wechat.bo.InputgetUserMsg; import com.kede.wechat.service.ConversationContentService; import com.tencent.wework.Finance; import org.json.JSONArray; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import com.kede.common.dao.ChatMsgUserMapper; import javax.annotation.Resource; import java.io.File; import java.io.FileOutputStream; import java.io.UnsupportedEncodingException; import java.util.*; import java.util.stream.Collectors; import static sun.plugin2.os.windows.OSVERSIONINFOA.size; @Service("ConversationContentService") public class ConversationContentServiceImpl extends BaseMybatisDao implements ConversationContentService { Logger logger = LoggerFactory.getLogger(ConversationContentServiceImpl.class); @Resource private RedisTemplate redisTemplate; @Resource private ChatMsgUserMapper chatMsgUserMapper; @Resource private ChatMsgMapper chatMsgMapper; @Value(value = "${conversationContent.corpid}") private String corpid; @Value(value = "${conversationContent.secret}") private String secret; @Value(value = "${conversationContent.app.secret}") private String appSecret; @Value(value = "${conversationContent.addressBook.secret}") private String addressBookSecret; @Value(value = "${upload.path}") private String uploadPath; static String priKey ="-----BEGIN PRIVATE KEY-----\n" + "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCnh5N/kiyeNx/y\n" + "dDKe3FO8HWj8tuQQUCkCc8ol1Sqmcs9ey7S2189UDbZOPeY2xiiMD6AdFVUK5Y0P\n" + "gbX/XZFVizhwXseE+1IV1k0w3C++5Y4Zll7nZoJ05ANMbj+dlamAlNYOutmc0lZf\n" + "CGXM5oeu+U0XDWE1+uY7TRAGV3OcA7GBraXiothncbkNf0ZwfBEGVyLNHcNODgwz\n" + "ECc0KJuEF2V+UAt11HloT60atSmdiktwbJ6KOJ62TM/eU+F/5d3UJLdw0Xb8kEFn\n" + "PYK/1mD8PGKFA6F0wSajNLc6iPg5mgiOS5j02N2+nEN8m7vIdL7Hd0yrigf5kEdl\n" + "x9PC7OYpAgMBAAECggEAIUhSCVok+xnAgw6Kr/zdtdWx8eLz1DnYq+ANHQ8IdiEB\n" + "Cbg2osylJ/HBcjHh9qfPjmPcT2rZhlysdZQzcBRKt0/9WnW59bVoTWZR148m/Snl\n" + "3Td+i0JWUJqr/Rc6FDiTgDQRgsOkT/+JoT+t2dNCyYRFyHqkAXFjJAzfTiM5mJjg\n" + "h8q7bU/LXoc49kuaNYmt5rV1nACoIh7MmKZpmR4OKXDWrl52Xt5qCEonp3bAH/S3\n" + "HaTqsoqot7fF5aZWEuDWUeYQPzgVSsdw2k9Lq1c8aoE15IRfQCxtBOYpk8LEDJty\n" + "JIGHrzBEHP7cok4UdBWbfuI1YjqmjefQovQumKqfcQKBgQDlXDrFFvx+k9pUI2bo\n" + "KXcqroOcpdsssO5uJOG1PwuM02wIR0hP1d89fItFwLLuzjb+jeyN3qwFgoh21fkk\n" + "Z3HkxubMY4fpXk1mAsTPUZxll8YYgGE7tXk1Rk5xsBMzlFRW88N7Ww/rQMBOlpJA\n" + "6UfZGFYMezb1vXf7u3M4w/N22wKBgQC6/OF5DsCHAOui8CPXS2z2YTKuoOJmHKIe\n" + "vBeXy+ic+YRuTBXgA0Z1wL4xDW/LeCqoTmetbTuvGSyahMV4QSK0pxH9gk80sH4+\n" + "YEza3DLASxr4gSsr2fL6siuXN/OHyMClQb6JVa0yuPG1zLzShaIXYVAyz1m9rU1B\n" + "JpQfbEV8SwKBgGnBDvAVWzLZ5Y9qC2b8x4+Mi+7MorSGmEl9A/1YJnE2gteGVpdJ\n" + "G/fz1xvAcECgIMdalToM8/BOcbGpk4jvkZpVA9I2ClLWQoXIvQqCrMRDKPnfJ/Yq\n" + "BMtFsaHF9/SObhzxpK7aHAry/ji+QI1hgtlc2UBEB+FjDVGq6sO/xiCFAoGAV/3Y\n" + "PJdskhskx7AprY6Y3/gtWW/sGhEvWTc6Avy5oeTpJN45DQl9hrwExCCGk0EhEcKT\n" + "l1Dn3SYDj1MbedNs+YYFOT6w9yJ2xfObNwKX/1VYg8iFAEW3ybE+QhLaTvNxdFLT\n" + "zty6fDv7wolt8cNg24+3pbFdkZyT1izJV2Aj8rECgYBZQMObUgJ57n8FrXCdcdSa\n" + "MGsFYl8KUZa1zvzhoi3h7YtbVNNtSHcEK7VDyIheBt9pFCN7nuDX3jW2XYW2USEC\n" + "T7Pab2DAXPkRmXspWNID21G+AqqGSLD4pk9+ZmqevTfAtI+ajiu5NH1guH73rVOM\n" + "xGjQ5dCmWpUGt4fmO+zWIw==\n" + "-----END PRIVATE KEY-----"; static String pubKey ="-----BEGIN PUBLIC KEY-----\n" + "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp4eTf5Isnjcf8nQyntxT\n" + "vB1o/LbkEFApAnPKJdUqpnLPXsu0ttfPVA22Tj3mNsYojA+gHRVVCuWND4G1/12R\n" + "VYs4cF7HhPtSFdZNMNwvvuWOGZZe52aCdOQDTG4/nZWpgJTWDrrZnNJWXwhlzOaH\n" + "rvlNFw1hNfrmO00QBldznAOxga2l4qLYZ3G5DX9GcHwRBlcizR3DTg4MMxAnNCib\n" + "hBdlflALddR5aE+tGrUpnYpLcGyeijietkzP3lPhf+Xd1CS3cNF2/JBBZz2Cv9Zg\n" + "/DxihQOhdMEmozS3Ooj4OZoIjkuY9NjdvpxDfJu7yHS+x3dMq4oH+ZBHZcfTwuzm\n" + "KQIDAQAB\n" + "-----END PUBLIC KEY-----"; @Override public Map getChatData(Integer pageSeq, Integer pageLimit) { String message = null; Map map = new HashMap<>(); List list = new ArrayList<>(); Integer total = 0; long sdk = Finance.NewSdk(); System.out.println(Finance.Init(sdk, corpid, secret)); long ret = 0; int seq = 0; int limit = 200; if (pageSeq != null || pageLimit!=null){ seq=pageSeq; limit = pageLimit; } long slice = Finance.NewSlice(); ret = Finance.GetChatData(sdk, seq, limit, null, null, 3, slice); if (ret != 0) { System.out.println("getchatdata ret " + ret); } String getchatdata = Finance.GetContentFromSlice(slice); JSONObject jo = new JSONObject(getchatdata); JSONArray chatdata = jo.getJSONArray("chatdata"); total=chatdata.length(); System.out.println("消息数:" + total); for (int i = 0; i < chatdata.length(); i++) { String item = chatdata.get(i).toString(); // item:{ // "publickey_ver":1, // "encrypt_chat_msg":"XSeHr+qM0YfX/q5WWvmnVEuL2E4U0RclkIbK9JnWQq7Y/0Ynir3srKh+9DH6BqRj/NYXKmUC65+0WRo // QboW3dC200XTqVNj+z0kljl11HdNmjuS3p7g0L+DYG5Bdz6Lo8FuHf/5WkOVi/R5VxOO6FvU+PediEOSCBN2dVHCeyIvExCk5mh // o+ME9QV/Q19HujmHpxzl3cu1XvBAZ7YvIpd2d/BCCI9JwmBc5bXr2FQ0r/PFkZadKGjw0cxqPyNIBkNc+ic0wHhWSZFTvY3qDW2 // FFAdkYW68w8PA5f+8gD9VUuxKzz/j3Fu/6547Ayyuo93lPtbud5lAWXyeLexyHujFmdr300MA44BoYZsuTqdVsHbtEGLw967kO1 // oHcImidD416ZuQh2VZiOYTJMtDZALdB1tXramb7kFj0AsKloFLKeg3ks3TYRKwEmM9wJ/y2hGDJzq5xncBFFShbLao5u", // "msgid":"1634016854685227651_1749628622146_external", // "encrypt_random_key":"kJ3XJM7CB7DGZqFxSfT8+EDWfr8vZmVVKzKLl5FM47Sd7iUSlgZF/a4dm5sTpCMW3uzk/m1LZV4odH // RyVO2+AaVJsidMoLV2LmmWiCAuXkzdK4yDbGItkvpZGrilgAlJjR8EhsUuqXOjvxkUemGvKMhrUqKdCaO4p3GYT/cxMRJDUmrP0v // TQqdgwznQOSubbBFDdMTSAfEtZnGp5tOQdCNFCbIqks4/Y8Isd/nd/Kq3QNsXjE+GdZkqVuOqRujOeCeqFRJF022i2KFuJQ+R+7X // 1es92NKBbaNT1AlRNfjtACH1KrPRLlEnmAS0EUIWWmn45/kOpH3T4ovOuNDnrafw==", // "seq":1} JSONObject data = new JSONObject(item); String encrypt_random_key = data.getString("encrypt_random_key"); String encrypt_chat_msg = data.getString("encrypt_chat_msg"); long msg = Finance.NewSlice(); try { message = RSAEncrypt.decryptRSA(encrypt_random_key, priKey); ret = Finance.DecryptData(sdk, message, encrypt_chat_msg, msg); if (ret != 0) { System.out.println("getchatdata ret " + ret); // return; } String str = String.valueOf(Finance.GetContentFromSlice(msg)); com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(str); String msgtype = jsonObject.getString("msgtype"); InputChatMsg chatMsg = new InputChatMsg(jsonObject); ChatMsg chatMsg1 = chatMsgMapper.selectByMsgId(chatMsg.getMsgid()); if (chatMsg1 == null){ //处理数据 pushSmgType(msgtype, jsonObject, sdk, chatMsg); list.add(chatMsg); } } catch (Exception e) { e.printStackTrace(); } } Finance.FreeSlice(slice); map.put("list",list); map.put("total",total); return map; } private void pushSmgType(String msgtype, com.alibaba.fastjson.JSONObject jsonObject, long sdk, InputChatMsg chatMsg) { if (msgtype.equals("text")) { //文档 com.alibaba.fastjson.JSONObject text = jsonObject.getJSONObject("text"); if (text!=null){ String content1 = text.getString("content"); chatMsg.setContent(pushCharset(content1)); // chatMsg.setContent(content1); } }else if (msgtype.equals("link")) { //链接 com.alibaba.fastjson.JSONObject link = jsonObject.getJSONObject("link"); chatMsg.setMsgurl(link.getString("link_url")); chatMsg.setContent(pushCharset(link.getString("title"))); }else if (msgtype.equals("mixed")) { //混合 System.out.println(jsonObject); com.alibaba.fastjson.JSONObject mixed = jsonObject.getJSONObject("mixed"); com.alibaba.fastjson.JSONArray item = mixed.getJSONArray("item"); for (int j = 0; j < item.size(); j++) { com.alibaba.fastjson.JSONObject e = item.getJSONObject(j); String type = e.getString("type"); if (type.equals("text")){ com.alibaba.fastjson.JSONObject contentJson = e.getJSONObject("content"); String content = contentJson.getString("content"); chatMsg.setContent(pushCharset(content)); }else { String url =uploadPath; com.alibaba.fastjson.JSONObject content = e.getJSONObject("content"); String sdkfileid=content.getString("sdkfileid"); if (type.equals("file")){ try { String filename = content.getString("filename"); String osname = System.getProperties().getProperty("os.name"); if (osname.contains("Windows")) { filename = new String(filename.getBytes("GBK"),"UTF-8"); String safeName=filename.replaceAll("[<>:\"/\\\\|?*,、]", "_"); url = url +"/wechat/"+ safeName; } } catch (UnsupportedEncodingException ex) { throw new RuntimeException(ex); } }else if (type.equals("image")) { url = url + "/wechat/" + System.currentTimeMillis() + ".jpg"; com.alibaba.fastjson.JSONObject image = jsonObject.getJSONObject("image"); }else { chatMsg.setContent(chatMsg.getContent()+"[附件="+e+"]"); } downloadFile(sdk, sdkfileid, url); chatMsg.setMsgurl(url); } } } else if (msgtype.equals("sphfeed")) { chatMsg.setContent(jsonObject.getString("sphfeed")); } else if (msgtype.equals("file")||msgtype.equals("image")||msgtype.equals("video")||msgtype.equals("voice")) { String url=pushFileUrl(sdk, msgtype, jsonObject); chatMsg.setMsgurl(url); } else { chatMsg.setContent(pushCharset(jsonObject.toJSONString())); } } private String pushCharset(String content1) { String str ; try { String osname = System.getProperties().getProperty("os.name"); if (osname.contains("Windows")) { String result = new String(content1.getBytes("GBK"),"UTF-8"); str=result; }else{ str=content1; } } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } return str; } private String pushFileUrl(long sdk, String msgtype, com.alibaba.fastjson.JSONObject jsonObject) { String url = uploadPath; String sdkfileid=null; if (msgtype.equals("file")){ com.alibaba.fastjson.JSONObject file = jsonObject.getJSONObject("file"); try { String filename = file.getString("filename"); sdkfileid = file.getString("sdkfileid"); String osname = System.getProperties().getProperty("os.name"); if (osname.contains("Windows")) { filename = new String(filename.getBytes("GBK"),"UTF-8"); String safeName=filename.replaceAll("[<>:\"/\\\\|?*,、]", "_"); url = url +"/wechat/"+ safeName; } } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } }else if (msgtype.equals("image")){ url = url +"/wechat/"+ System.currentTimeMillis()+".jpg"; com.alibaba.fastjson.JSONObject image = jsonObject.getJSONObject("image"); sdkfileid = image.getString("sdkfileid"); }else if (msgtype.equals("voice")){ url = url +"/wechat/"+ System.currentTimeMillis()+".mp3"; com.alibaba.fastjson.JSONObject image = jsonObject.getJSONObject("voice"); sdkfileid = image.getString("sdkfileid"); }else if (msgtype.equals("video")){ url = url +"/wechat/"+ System.currentTimeMillis()+".mp4"; com.alibaba.fastjson.JSONObject image = jsonObject.getJSONObject("video"); } // 下载文件 downloadFile(sdk, sdkfileid, url); return url; } private void downloadFile(long sdk, String sdkfileid, String url) { String indexbuf = ""; while(true){ //每次使用GetMediaData拉取存档前需要调用NewMediaData获取一个media_data,在使用完media_data中数据后,还需要调用FreeMediaData释放。 long media_data = Finance.NewMediaData(); int ret = Finance.GetMediaData(sdk, indexbuf, sdkfileid, null, null, 3, media_data); if(ret!=0){ System.out.println("getmediadata ret:" + ret); Finance.FreeMediaData(media_data); return; } System.out.printf("getmediadata outindex len:%d, data_len:%d, is_finis:%d\n",Finance.GetIndexLen(media_data),Finance.GetDataLen(media_data), Finance.IsMediaDataFinish(media_data)); try { File file = new File(url); if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); // 自动创建缺失的父目录 } //大于512k的文件会分片拉取,此处需要使用追加写,避免后面的分片覆盖之前的数据。 FileOutputStream outputStream = new FileOutputStream(url, true); outputStream.write(Finance.GetData(media_data)); outputStream.close(); } catch (Exception e) { e.printStackTrace(); } if(Finance.IsMediaDataFinish(media_data) == 1) { //已经拉取完成最后一个分片 Finance.FreeMediaData(media_data); break; } else { //获取下次拉取需要使用的indexbuf indexbuf = Finance.GetOutIndexBuf(media_data); Finance.FreeMediaData(media_data); } } } @Override public String getAccessToken() { //获取redis缓存数据 String accessToken = null; Map accessMap = (Map) redisTemplate.opsForValue().get("ACCESS_TOKEN"); if (accessMap == null){ logger.debug("getAccessToken无缓存从接口获取"); Map map = getAccessMap(corpid, secret); //新增redis缓存数据 redisTemplate.opsForValue().set("ACCESS_TOKEN",map); accessToken = map.get("accessToken"); }else { logger.debug("getAccessToken有缓存从缓存获取"); accessToken = accessMap.get("accessToken"); Long expireDate = Long.valueOf(accessMap.get("expireDate")); if (expireDate < System.currentTimeMillis()){ logger.debug("getAccessToken缓存已过期从接口获取"); Map map = getAccessMap(corpid, secret); accessToken = map.get("accessToken"); //新增redis缓存数据 redisTemplate.opsForValue().set("ACCESS_TOKEN",map); } } return accessToken; } public String getAddressBookAccessToken() { //获取redis缓存数据 String accessToken = null; Map accessMap = (Map) redisTemplate.opsForValue().get("ADDRESS_BOOK_ACCESS_TOKEN"); if (accessMap == null){ logger.debug("ADDRESS_BOOK无缓存从接口获取"); Map map = getAccessMap(corpid, secret); //新增redis缓存数据 redisTemplate.opsForValue().set("ADDRESS_BOOK_ACCESS_TOKEN",map); accessToken = map.get("accessToken"); }else { logger.debug("ADDRESS_BOOK有缓存从缓存获取"); accessToken = accessMap.get("accessToken"); Long expireDate = Long.valueOf(accessMap.get("expireDate")); if (expireDate < System.currentTimeMillis()){ logger.debug("ADDRESS_BOOK缓存已过期从接口获取"); Map map = getAccessMap(corpid, secret); accessToken = map.get("accessToken"); //新增redis缓存数据 redisTemplate.opsForValue().set("ADDRESS_BOOK_ACCESS_TOKEN",map); } } return accessToken; } @Override public String getAppAccessToken() { //获取redis缓存数据 String accessToken = null; Map accessMap = (Map) redisTemplate.opsForValue().get("ADDRESS_BOOK_ACCESS_TOKEN"); if (accessMap == null){ logger.debug("APP_ACCESS_TOKEN无缓存从接口获取"); Map map = getAccessMap(corpid,appSecret); //新增redis缓存数据 redisTemplate.opsForValue().set("APP_ACCESS_TOKEN",map); accessToken = map.get("accessToken"); }else { logger.debug("APP_ACCESS_TOKEN有缓存从缓存获取"); accessToken = accessMap.get("accessToken"); Long expireDate = Long.valueOf(accessMap.get("expireDate")); if (expireDate < System.currentTimeMillis()){ logger.debug("APP_ACCESS_TOKEN缓存已过期从接口获取"); Map map = getAccessMap(corpid,appSecret); accessToken = map.get("accessToken"); //新增redis缓存数据 redisTemplate.opsForValue().set("APP_ACCESS_TOKEN",map); } } return accessToken; } @Override public String getPermitUserList() { String url=String.format("https://qyapi.weixin.qq.com/cgi-bin/msgaudit/get_permit_user_list?access_token=%s",getAccessToken()); com.alibaba.fastjson.JSONObject result = HttpUtils.httpGet(url); if (result.getInteger("errcode")==0){ List ids = result.getJSONArray("ids").toJavaList(String.class); ids.stream().forEach(System.out::println); }else { System.out.println(result.getString("errcode")); System.out.println("获取会话内容存档成员列表失败"); } pushGetChatName(result.toJSONString()); return null; } @Override public Map pushGetChatName(String userId) { Map map = new HashMap<>(); Integer i = 0; ChatMsgUser chatMsgUser = chatMsgUserMapper.selectByUserId(userId); if (chatMsgUser != null){ map.put("name",chatMsgUser.getName()); map.put("code",i); return map; }else { String msgIdSub = userId.substring(0, 2); String url=null; Integer type; if (msgIdSub.equals("wb")){ type=0; // url=String.format("https://qyapi.weixin.qq.com/cgi-bin/msgaudit/get_robot_info??access_token=%s&robot_id=%s",getAppAccessToken(),userId); }else if (msgIdSub.equals("wo")||msgIdSub.equals("wm")){ // https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get url=String.format("https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get?access_token=%s&external_userid=%s",getAppAccessToken(),userId); type=1; }else { url=String.format("https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=%s&userid=%s",getAccessToken(),userId); type=2; } Map maps = getUserName(url, type); Object o = maps.get("name"); String userName = null; if(o!=null){ userName = o.toString(); } i= (Integer) maps.get("code"); System.out.println(userId+"="+userName); if (StringUtils.isNotBlank(userName)){ chatMsgUser = new ChatMsgUser(); chatMsgUser.setUserId(userId); chatMsgUser.setName(userName); chatMsgUser.setType(type); chatMsgUser.setCreateTime(new Date()); chatMsgUserMapper.insert(chatMsgUser); } map.put("name",userName); map.put("code",i); return map; } } /** * errorGode 错误码 * 301059=非内部群,不提供数据 * 90501=该群不是客户群 * @param chatMsg * @return */ @Override public String pushGetRoomName(ChatMsg chatMsg) { String name=null; // https://qyapi.weixin.qq.com/cgi-bin/externalcontact/groupchat/get?access_token=ACCESS_TOKEN String roomid = chatMsg.getRoomid(); ChatMsgUser chatMsgUser = chatMsgUserMapper.selectByUserId(roomid); if (chatMsgUser != null){ return chatMsgUser.getName(); }else { //查询编号中有没有external String msgIdSub = chatMsg.getMsgid(); int i = msgIdSub.indexOf("external"); if (i>0){ String url=String.format("https://qyapi.weixin.qq.com/cgi-bin/externalcontact/groupchat/get?access_token=%s",getAppAccessToken()); Map map = new HashMap(); map.put("chat_id",roomid); map.put("cursor",0); com.alibaba.fastjson.JSONObject jsonObject = HttpUtils.httpPost(url, map); String roomname = jsonObject.getString("roomname"); if (StringUtils.isBlank(roomname)){ com.alibaba.fastjson.JSONObject groupChat = jsonObject.getJSONObject("group_chat"); if (groupChat!=null){ name = groupChat.getString("name"); } } if (jsonObject.getInteger("errcode")==0){ }else { System.out.println("获取外部群名称失败"+jsonObject.getString("errcode")); } } else { //https://qyapi.weixin.qq.com/cgi-bin/msgaudit/groupchat/get String url=String.format("https://qyapi.weixin.qq.com/cgi-bin/msgaudit/groupchat/get?access_token=%s",getAccessToken()); Map map = new HashMap(); map.put("roomid",roomid); com.alibaba.fastjson.JSONObject jsonObject = HttpUtils.httpPost(url, map); System.out.println(jsonObject.toJSONString()); String roomname = jsonObject.getString("roomname"); if (StringUtils.isBlank(roomname)){ com.alibaba.fastjson.JSONObject groupChat = jsonObject.getJSONObject("group_chat"); name = groupChat.getString("name"); } if (jsonObject.getInteger("errcode")==0){ }else { System.out.println("获取内部群名称失败"+jsonObject.getString("errcode")); } } } return name; } @Override public Object getMsgData(InputGetChatName in) { List list = chatMsgUserMapper.getUserList(2); list.forEach(e->{ //查询每个人的所有信息 List chatMsgs = chatMsgMapper.selectMsgById(e.getUserId(),null); List collect = chatMsgs.stream().filter(e1 -> e1.getType().equals(0)).collect(Collectors.toList()); List collect1 = chatMsgs.stream().filter(e1 -> e1.getType().equals(1)).collect(Collectors.toList()); List toUser=new ArrayList<>(); List toList=new ArrayList<>(); collect.forEach(e1->{ if (e1.getFromId().equals(e.getUserId())){ if (!toUser.contains(e1.getTolist())){ toUser.add(e1.getTolist()); } }else { if (!toUser.contains(e1.getFromId())){ toUser.add(e1.getFromId()); } } }); collect1.forEach(e1->{ if (e1.getFromId().equals(e.getUserId())){ if (!toList.contains(e1.getRoomid())){ toList.add(e1.getRoomid()); } }else { if (!toList.contains(e1.getRoomid())){ toList.add(e1.getRoomid()); } } }); System.out.println(e.getName()+"单聊有:"); toUser.forEach(System.out::println); System.out.println("================================"); System.out.println(e.getName()+"群聊有:"); toList.forEach(System.out::println); }); return list; } @Override public Object getUserMsg(InputgetUserMsg in) { List list = chatMsgUserMapper.getUserList(2); return list; } @Override public Object getMyIdByUser(InputgetUserMsg in) { return chatMsgUserMapper.selectMyIdByUser(in.getUserId()); } @Override public Object getMyIdByRoom(InputgetUserMsg in) { return chatMsgUserMapper.selectMyIdByRoom(in.getUserId()); } @Override public Object getMsgList(InputgetUserMsg in) { List chatMsgs=new ArrayList<>(); if (StringUtils.isNotEmpty(in.getRoomId())){ chatMsgs = chatMsgMapper.selectByRoomId(in); }else if (StringUtils.isNotEmpty(in.getUserId())&&StringUtils.isNotEmpty(in.getFoId())){ chatMsgs = chatMsgMapper.selectByUserIdAndFoId(in); //将list按时间先后排序 chatMsgs.sort(Comparator.comparing(ChatMsg::getMsgtime)); } for (ChatMsg e : chatMsgs) { WechatSmgTypeEnum field = WechatSmgTypeEnum.getField(e.getMsgtype()); if (field==null){ e.setMsgType(e.getMsgtype()); }else { String desc = field.getDesc(); e.setMsgType(desc); } } return chatMsgs; } private Map getUserName(String url,Integer type){ String name = null; Integer code=null; Map map=new HashMap(); if (type==0) { name="机器人"; code=0; }else if (type==1){ com.alibaba.fastjson.JSONObject result = HttpUtils.httpGet(url); if (result.getInteger("errcode")==0) { System.out.println(result.toJSONString()); com.alibaba.fastjson.JSONObject externalContact = result.getJSONObject("external_contact"); code = result.getInteger("errcode"); name=externalContact.getString("name"); }else { code = result.getInteger("errcode"); System.out.println(result.toJSONString()); System.out.println("获取外部联系人名称失败"); } }else if (type==2){ com.alibaba.fastjson.JSONObject result = HttpUtils.httpGet(url); if (result.getInteger("errcode")==0) { System.out.println(result.toJSONString()); com.alibaba.fastjson.JSONObject externalContact = result.getJSONObject("external_contact"); code = result.getInteger("errcode"); name = result.getString("name"); }else { System.out.println(result.toJSONString()); System.out.println("获取内部联系人名称失败"); code = result.getInteger("errcode"); } } if(name!=null)map.put("name",name); if (code!=null)map.put("code",code); return map; } private Map getAccessMap(String corpid, String secret) { String url=String.format("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s",corpid,secret); Date date = new Date(); com.alibaba.fastjson.JSONObject jsonObject = HttpUtils.httpGet(url); String access_token = (String) jsonObject.get("access_token"); Integer expires_in = (Integer) jsonObject.get("expires_in"); //时间加上过期时间 Date expireDate = DateUtils.addMilliseconds(date, expires_in*1000); Map map = new HashMap<>(); map.put("accessToken",access_token); map.put("expireDate", String.valueOf(expireDate.getTime())); return map; } }