package project.onlinechat.otc.internal; import java.net.URLDecoder; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; import org.springframework.util.CollectionUtils; import kernel.exception.BusinessException; import kernel.util.DateUtils; import kernel.util.StringUtils; import kernel.web.ApplicationUtil; import project.c2c.C2cOrder; import project.c2c.C2cOrderService; import project.onlinechat.otc.OtcMessageUser; import project.onlinechat.otc.OtcOnlineChatMessage; import project.onlinechat.otc.OtcOnlineChatMessageService; import project.party.PartyService; import project.party.model.Party; import project.party.model.UserRecom; import project.party.recom.UserRecomService; import project.tip.TipConstants; import project.tip.TipService; @SuppressWarnings("unchecked") public class OtcOnlineChatMessageServiceImpl implements OtcOnlineChatMessageService { private TipService tipService; private PartyService partyService; private C2cOrderService c2cOrderService; private UserRecomService userRecomService; private Map cahce_user = new ConcurrentHashMap(); private Map> cahce_chat = new ConcurrentHashMap>(); public List cacheGetList(String messageId, int pageSize, String orderNo) { List cache = cahce_chat.get(orderNo); if (cache == null) return new LinkedList(); int start = cacheIndex(messageId, cache); int end = start + pageSize; if (start >= cache.size()) return Collections.EMPTY_LIST; if (cache.size() <= end) end = cache.size(); return cache.subList(start, end); } public List cacheGetList(String messageId, int pageSize, String orderNo, String clicentType) { List cache = cahce_chat.get(orderNo); if (cache == null) return new LinkedList(); List result = cache; if ("user".equals(clicentType)) result = cache.stream().filter(oocm->0==oocm.getDelete_status()).collect(Collectors.toList()); int start = cacheIndex(messageId, result); int end = start + pageSize; if (start >= result.size()) return new LinkedList(); if (result.size() <= end) end = result.size(); return result.subList(start, end); } /** * 根据消息ID获取消息在列表中的索引 * @param messageId 消息ID * @param list 消息对象表 * @return 消息索引 */ private int cacheIndex(String messageId, List list) { if (null==messageId || (messageId=messageId.trim()).isEmpty()) return 0; int index = -1; for (int i = 0; i < list.size(); i++) { if (messageId.equals(list.get(i).getId().toString())) { index = i; break; } } if (index == -1) throw new BusinessException("参数异常,消息获取失败"); return index + 1; } @Override public List cacheGetMessageUserPage(int pageNo, int pageSize) { List result = cahce_user.values().stream().filter(omu->-1!=omu.getDelete_status()).collect(Collectors.toList()); Collections.sort(result); return result; } @Override public void saveSend(String partyId, String type, String content, String username, String orderNo) { OtcOnlineChatMessage onlineChatMessage = new OtcOnlineChatMessage(); onlineChatMessage.setPartyId(partyId); onlineChatMessage.setType(type); onlineChatMessage.setSend_receive(""); onlineChatMessage.setContent(content); onlineChatMessage.setCreateTime(new Date()); onlineChatMessage.setUsername(username); onlineChatMessage.setOrder_no(orderNo); ApplicationUtil.executeInsert(onlineChatMessage); List list = cahce_chat.get(orderNo); if (list == null) list = new LinkedList(); list.add(onlineChatMessage); Collections.sort(list,Comparator.reverseOrder()); this.cahce_chat.put(orderNo, list); // 不存在则添加用户 if (!cahce_user.containsKey(orderNo)) saveCreateByOrderNo(orderNo); //用户发送 if (null == username) { updateUnread(partyId, "write", orderNo); tipService.saveTip(onlineChatMessage.getId().toString(), TipConstants.OTCORDER_ONLINECHAT); }else { //后台客服 updateUnreadAdmin(partyId, "write", orderNo); } } /** * 更新未读数 * @param type read:读,write:写 */ public void updateUnread(String partyId, String type, String orderNo) { OtcMessageUser messageUser = cahce_user.get(orderNo); if (messageUser == null) { saveCreateByOrderNo(orderNo); messageUser = cahce_user.get(orderNo); } C2cOrder c2cOrder = c2cOrderService.get(orderNo); // 承兑商ID String c2cUserId = c2cOrder.getC2cUserPartyId(); // 下单用户ID String orderUserId = c2cOrder.getPartyId(); if (partyId.equals(c2cUserId)) { // 用户承兑商 if ("read".equals(type)) { messageUser.setCustomer_unreadmsg(0); } else if ("write".equals(type)) { messageUser.setUser_unreadmsg(messageUser.getCustomer_unreadmsg() + 1); messageUser.setDelete_status(0); } }else if(partyId.equals(orderUserId)) { //下单用户 if ("read".equals(type)) { messageUser.setUser_unreadmsg(0); } else if ("write".equals(type)) { messageUser.setCustomer_unreadmsg(messageUser.getUser_unreadmsg() + 1); messageUser.setDelete_status(0); } } updateMessageUser(messageUser); } /** * 更新未读数 * @param type read:读,write:写 */ public void updateUnreadAdmin(String partyId, String type, String orderNo) { OtcMessageUser messageUser = cahce_user.get(orderNo); if (messageUser == null) { saveCreateByOrderNo(orderNo); messageUser = cahce_user.get(orderNo); } C2cOrder c2cOrder = c2cOrderService.get(orderNo); // 承兑商ID String c2cUserId = c2cOrder.getC2cUserPartyId(); // 下单用户ID String orderUserId = c2cOrder.getPartyId(); // 后台承兑商 发送 if (partyId.equals(c2cUserId)) { if ("read".equals(type)) { messageUser.setCustomer_unreadmsg(0); } else if ("write".equals(type)) { messageUser.setUser_unreadmsg(messageUser.getUser_unreadmsg() + 1); messageUser.setDelete_status(0); } } else if (partyId.equals(orderUserId)){ // 下单用户发送 if ("read".equals(type)) { messageUser.setUser_unreadmsg(0); } else if ("write".equals(type)) { messageUser.setCustomer_unreadmsg(messageUser.getUser_unreadmsg() + 1); messageUser.setDelete_status(0); } } updateMessageUser(messageUser); } /** * 移除通知 * * @param orderNo * @param removeTipNum */ public void removeTips(String orderNo, int removeTipNum) { List list = this.cacheGetList(null, removeTipNum, orderNo); tipService.deleteTip(list.stream().map(oocm->oocm.getId().toString()).collect(Collectors.toList())); } public void updateMessageUser(OtcMessageUser messageUser) { ApplicationUtil.executeSaveOrUpdate(messageUser); cahce_user.put(messageUser.getOrder_no(), messageUser); } public OtcMessageUser saveCreateByOrderNo(String orderNo) { OtcMessageUser messageUser = cahce_user.get(orderNo); if (messageUser == null) { messageUser = new OtcMessageUser(); messageUser.setOrder_no(orderNo); } messageUser.setUpdateTime(new Date()); ApplicationUtil.executeSaveOrUpdate(messageUser); cahce_user.put(orderNo, messageUser); return messageUser; } @Override public void delete(String orderNo) { OtcMessageUser messageUser = cahce_user.get(orderNo); if(null==messageUser) return; messageUser.setDelete_status(-1); this.updateMessageUser(messageUser); } /** * 批量获取未读数 * @param orderNos * @param type * @return */ public Map unreadMsgs(List orderNos){ return CollectionUtils.isEmpty(orderNos)?Collections.EMPTY_MAP:orderNos.stream() .collect(Collectors.toMap(orderNo->orderNo, orderNo->unreadMsgAdmin(orderNo),(oldValue,newValue)->newValue)); } /** * 管理后台获取未读消息 */ public int unreadMsgAdmin(String orderNo) { int unreadmsg = 0; if (!StringUtils.isNullOrEmpty(orderNo)) { OtcMessageUser messageUser = cahce_user.get(orderNo); if (messageUser != null) unreadmsg = messageUser.getCustomer_unreadmsg(); } else { for(Iterator> it=cahce_user.entrySet().iterator(); it.hasNext(); unreadmsg += it.next().getValue().getCustomer_unreadmsg()); } return unreadmsg; } public Map unreadMsgsApi(List orderNos){ return orderNos.stream().collect(Collectors.toMap(orderNo->orderNo,orderNo->unreadMsgApi(orderNo),(oldValue,newValue)->newValue)); } public int unreadMsgApi(String orderNo) { int unreadmsg = 0; if (!StringUtils.isNullOrEmpty(orderNo)) { OtcMessageUser messageUser = cahce_user.get(orderNo); if (messageUser != null) unreadmsg = messageUser.getUser_unreadmsg(); } else { for(Iterator> it=cahce_user.entrySet().iterator(); it.hasNext(); unreadmsg += it.next().getValue().getUser_unreadmsg()); } return unreadmsg; } @Override public int unreadMsg(String orderNo, String partyId) { C2cOrder c2cOrder = c2cOrderService.get(orderNo); // 承兑商ID String c2cUserId = c2cOrder.getC2cUserPartyId(); // 下单用户ID String orderUserId = c2cOrder.getPartyId(); int unreadmsg = 0; OtcMessageUser messageUser = cahce_user.get(orderNo); if(null==messageUser) return unreadmsg; if (partyId.equals(c2cUserId)) { //承兑商 unreadmsg = messageUser.getCustomer_unreadmsg(); }else if (partyId.equals(orderUserId)) { //下单用户 unreadmsg = messageUser.getUser_unreadmsg(); } return unreadmsg; } /** * 设置备注 * * @param partyId * @param remarks */ public String resetRemarks(String orderNo, String remarks) throws Exception { if (StringUtils.isEmptyString(remarks) || StringUtils.isEmptyString(remarks.trim())) return null; OtcMessageUser messageUser = this.cacheMessageUser(orderNo); if (messageUser == null) throw new BusinessException("用户不存在"); messageUser.setRemarks(URLDecoder.decode(remarks, "utf-8")); this.updateMessageUser(messageUser); return remarks; } /** * 获取用户信息 * * @param partyId * @return */ public Map saveGetUserInfo(String orderNo, String partyId) { OtcMessageUser messageUser = this.cacheMessageUser(orderNo); Party party = partyService.cachePartyBy(partyId, true); if (party == null) throw new BusinessException("用户不存在"); if (messageUser == null) messageUser = this.saveCreateByOrderNo(orderNo); Map result = new HashMap(); result.put("remarks", messageUser.getRemarks()); result.put("username", party.getUsername()); result.put("usercode", party.getUsercode()); result.put("last_login_time", DateUtils.format(party.getLast_loginTime(), DateUtils.DF_yyyyMMddHHmmss)); result.put("create_time", DateUtils.format(party.getCreateTime(), DateUtils.DF_yyyyMMddHHmmss)); result.put("role_name", party.getRolename()); result.put("login_ip", party.getLogin_ip()); List parents = userRecomService.getParents(party.getId()); if (!CollectionUtils.isEmpty(parents) && parents.size() >= 2) { Party parentParty = partyService.cachePartyBy(parents.get(1).getPartyId(), true); result.put("recom_parent_name", parentParty == null ? null : parentParty.getUsername()); } else { result.put("recom_parent_name", null); } return result; } public OtcOnlineChatMessage getMessageById(String messageId) { return ApplicationUtil.executeGet(messageId,OtcOnlineChatMessage.class); } public void updateMessageDelete(String messageId, String targetUserName) { OtcOnlineChatMessage otcOnlineChatMessage = getMessageById(messageId); if (otcOnlineChatMessage.getDelete_status() == -1) throw new BusinessException("该消息已撤回"); String partyId=otcOnlineChatMessage.getPartyId(); String userKey = StringUtils.isEmptyString(partyId)?otcOnlineChatMessage.getIp():partyId; otcOnlineChatMessage.setDelete_status(-1); ApplicationUtil.executeUpdate(otcOnlineChatMessage); List list=cahce_chat.get(otcOnlineChatMessage.getOrder_no()); int indexOf = list.indexOf(otcOnlineChatMessage); list.remove(indexOf); list.add(indexOf, otcOnlineChatMessage); cahce_chat.put(userKey, list); } public void init() { List list_user = ApplicationUtil.executeSelect(OtcMessageUser.class); list_user.forEach(omu->cahce_user.put(omu.getOrder_no(), omu)); List list_chat=ApplicationUtil.executeDQL("SELECT * FROM T_OTC_ONLINECHAT_MESSAGE ORDER BY CREATE_TIME DESC",OtcOnlineChatMessage.class); for (int i=0; i list = cahce_chat.get(item.getOrder_no()); if (null==list) cahce_chat.put(item.getOrder_no(),list=new LinkedList()); list.add(item); } } public Map> cacheMessageAll() { return cahce_chat; } public Map cacheMessageUserAll() { return cahce_user; } public OtcMessageUser cacheMessageUser(String key) { return cahce_user.get(key); } public List cacheMessage(String key) { return cahce_chat.get(key); } public void putMessage(String key, List value) { cahce_chat.put(key, value); } public void putMessageUser(String key, OtcMessageUser value) { cahce_user.put(key, value); } public void updateMessageUserByIp(OtcMessageUser messageUser) { ApplicationUtil.executeSaveOrUpdate(messageUser); cahce_user.put(messageUser.getIp(), messageUser); } public void deleteByIp(String ip) { OtcMessageUser messageUser = cahce_user.get(ip); if (messageUser == null) return; messageUser.setDelete_status(-1); this.updateMessageUserByIp(messageUser); } public void setPartyService(PartyService partyService) { this.partyService = partyService; } public void setUserRecomService(UserRecomService userRecomService) { this.userRecomService = userRecomService; } public void setTipService(TipService tipService) { this.tipService = tipService; } public C2cOrderService getC2cOrderService() { return c2cOrderService; } public void setC2cOrderService(C2cOrderService c2cOrderService) { this.c2cOrderService = c2cOrderService; } }