package com.yami.trading.service.chat.online; import com.yami.trading.bean.Tip; import com.yami.trading.bean.chat.domain.MessageUser; import com.yami.trading.bean.chat.domain.OnlineChatMessage; import com.yami.trading.bean.model.Customer; import com.yami.trading.common.constants.TipConstants; import com.yami.trading.common.exception.BusinessException; import com.yami.trading.common.util.StringUtils; import com.yami.trading.common.util.UnicodeUtils; import com.yami.trading.service.chat.MessageUserService; import com.yami.trading.service.customer.CustomerService; import com.yami.trading.service.system.TipService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.net.URLDecoder; import java.util.*; /** * @author lucas */ @Service public class OnlineChatVisitorMessageServiceImpl implements OnlineChatVisitorMessageService { @Autowired private TipService tipService; @Autowired OnlineChatMessageService onlinechatMessageService; @Autowired private MessageUserService messageUserService; @Autowired CustomerService customerService; @Autowired private DBOnlineChatVisitorMessageServiceImpl onlineChatVisitorMessageService; @Override public OnlineChatMessage saveSend(String ip, String type, String send_receive, String content, String username, boolean isAutoAnswer) { OnlineChatMessage onlineChatMessage = new OnlineChatMessage(); // onlineChatMessage.setPartyId(ip); onlineChatMessage.setContentType(type); onlineChatMessage.setSendReceive(send_receive); content = UnicodeUtils.gbEncoding(content); onlineChatMessage.setContent(content); onlineChatMessage.setCreateTime(new Date()); onlineChatMessage.setUsername(username); onlineChatMessage.setIp(ip); onlineChatMessage.setDeleteStatus(0); onlineChatVisitorMessageService.save(onlineChatMessage); List list = onlinechatMessageService.cacheMessage(ip); if (list == null) { list = new LinkedList(); } list.add(onlineChatMessage); Collections.sort(list); Collections.reverse(list);// 添加完后,时间倒叙排序加回 onlinechatMessageService.putMessage(ip, list); if (onlinechatMessageService.cacheMessageUser(ip) == null) {// 不存在则添加用户 saveCreate(ip, username); } switch (send_receive) { case "receive":// 客服发送 if (!isAutoAnswer) { updateUnread(ip, "user", "write"); } break; case "send":// 用户发送 updateUnread(ip, "customer", "write"); // tipService.saveTip(onlineChatMessage.getId().toString(), TipConstants.ONLINECHAT); break; } return onlineChatMessage; } /** * 更新未读数 * * @param ip * @param user_customer 更新对象,用户,客服 * @param type read:读,write:写 */ public void updateUnread(final String ip, String user_customer, String type) { MessageUser messageUser = onlinechatMessageService.cacheMessageUser(ip); if (messageUser == null) { saveCreate(ip, null); messageUser = onlinechatMessageService.cacheMessageUser(ip); } int removeTipNum = 0; switch (user_customer) { case "user": if ("read".equals(type)) { messageUser.setUserUnreadmsg(0); } else if ("write".equals(type)) { messageUser.setUserUnreadmsg(messageUser.getUserUnreadmsg() + 1); messageUser.setDeleteStatus(0); } break; case "customer": if ("read".equals(type)) { removeTipNum = messageUser.getCustomerUnreadmsg(); messageUser.setCustomerUnreadmsg(0); } else if ("write".equals(type)) { messageUser.setCustomerUnreadmsg(messageUser.getCustomerUnreadmsg() + 1); messageUser.setDeleteStatus(0); final String targetUsername = onlinechatMessageService.userSendTarget(ip, new Date(), messageUser.getTargetUsername()); if (StringUtils.isNotEmpty(targetUsername) && !targetUsername.equals(messageUser.getTargetUsername())) { final Customer customer = customerService.cacheByUsername(targetUsername); // 客服不存在或者回复内容无效则不回复 if (customer != null && customer.getAutoAnswer() != null && !StringUtils.isEmptyString(customer.getAutoAnswer().trim())) { // 客服自动回复一条 saveSend(ip, "text", "receive", customer.getAutoAnswer(), targetUsername + "SYSTEM", true); // Thread t = new Thread(new Runnable() { // @Override // public void run() { // // TODO Auto-generated method stub // // 异步,延迟200毫秒发送 // ThreadUtils.sleep(200); // saveSend(ip, "text", "receive", customer.getAutoAnswer(), targetUsername + "SYSTEM");// 客服自动回复一条 // } // }); // t.start(); } } messageUser.setTargetUsername(targetUsername); if (StringUtils.isNotEmpty(targetUsername)) {// 指定的在线客服存在,则发起通知 Tip tip = new Tip(); tip.setBusinessId(onlinechatMessageService.cacheMessage(ip).get(0).getUuid().toString()); tip.setModel(TipConstants.ONLINECHAT); tip.setTargetUsername(targetUsername); tipService.saveTip(tip); } } break; } onlinechatMessageService.updateMessageUserByIp(messageUser); if (removeTipNum > 0) onlinechatMessageService.removeTips(messageUser.getIp(), removeTipNum); } @Override public MessageUser saveCreate(String ip, String username) { MessageUser messageUser = onlinechatMessageService.cacheMessageUser(ip); if (messageUser == null) { messageUser = new MessageUser(); messageUser.setIp(ip); messageUser.setUserUnreadmsg(0); messageUser.setCustomerUnreadmsg(0); } messageUser.setUpdatetime(new Date()); messageUser.setDeleteStatus(0); messageUser.setTargetUsername(username); messageUserService.saveOrUpdate(messageUser); onlinechatMessageService.putMessageUser(ip, messageUser); return messageUser; } /** * 设置备注 * * @param ip * @param remarks */ public String updateResetRemarks(String ip, String remarks) throws Exception { if (StringUtils.isEmptyString(remarks) || StringUtils.isEmptyString(remarks.trim())) { return null; } MessageUser messageUser = onlinechatMessageService.cacheMessageUser(ip); if (messageUser == null) { throw new BusinessException("用户不存在"); } messageUser.setRemarks(URLDecoder.decode(remarks, "utf-8")); onlinechatMessageService.updateMessageUserByIp(messageUser); return remarks; } /** * 获取用户信息 * * @param ip * @return */ public Map getUserInfo(String ip) { MessageUser messageUser = this.onlinechatMessageService.cacheMessageUser(ip); Map result = new HashMap(); result.put("partyId", ip); 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("loginIp", party.getLoginIp()); // 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; } }