From c862955f695e33d7683d1f5da33504f4bf95f23c Mon Sep 17 00:00:00 2001 From: fs-danaus <danaus314@qq.com> Date: 星期一, 11 七月 2022 10:04:35 +0800 Subject: [PATCH] 优化websocket右下角弹窗的实现 --- src/com/yc/sdk/WebSocketMessage/entity/MessageType.java | 2 src/com/yc/open/init/InitSystemTaks.java | 3 src/com/yc/open/init/shcedule/MessageTipsEntity.java | 45 +++++++ src/com/yc/sdk/WebSocketMessage/api/messagelistener/WebSocketMessageListener.java | 20 ++- src/com/yc/sdk/WebSocketMessage/action/WebSocketMessageServer.java | 18 +- WebRoot/js/index/WebSocketMessage.js | 87 ++++++++++++++ WebRoot/home.jsp | 20 +- src/com/yc/open/init/shcedule/MessagePopTipsSchedule.java | 160 ++++++++++++++++++++++++++ 8 files changed, 326 insertions(+), 29 deletions(-) diff --git a/WebRoot/home.jsp b/WebRoot/home.jsp index 6c526b5..1cd40ca 100644 --- a/WebRoot/home.jsp +++ b/WebRoot/home.jsp @@ -773,19 +773,19 @@ return false; } $(function () { - maintaince.dbid =<%=dbid%>; + /* maintaince.dbid =<%=dbid%>; maintaince.isStop = 'false'; - setInterval(messagehint.popupMessageHint, 120000);//120绉掕皟鐢ㄤ竴娆� (120000) + setInterval(messagehint.popupMessageHint, 120000);//120绉掕皟鐢ㄤ竴娆� (120000)*/ //鏄惁鏄剧ず绯荤粺娑堟伅 2012-09-18 - var flag = checkBoxIsChecked(128, menuConfig); - var v = $.cookie(userCode); - if (flag) { - funB(); - } else { - $.cookie(userCode, 'false'); - //funB(); - } + // var flag = checkBoxIsChecked(128, menuConfig); + // var v = $.cookie(userCode); + // if (flag) { + // funB(); + // } else { + // $.cookie(userCode, 'false'); + // //funB(); + // } ///end if (1 ==<%= ((request.getAttribute("reurl")!=null || request.getAttribute("wxUrl")!=null ||request.getParameter("wx")!=null || request.getAttribute("wx")!=null ) ? 1: menuFold) %>) { diff --git a/WebRoot/js/index/WebSocketMessage.js b/WebRoot/js/index/WebSocketMessage.js index b547def..4d9c3fc 100644 --- a/WebRoot/js/index/WebSocketMessage.js +++ b/WebRoot/js/index/WebSocketMessage.js @@ -44,14 +44,95 @@ var json= JSON.parse(e.data); if(json.info.msgType==6014){ //閲嶅畾鍚戝埌鐧诲綍椤甸潰 - location="/login.jsp?m=6015&d="+json.info.dbId; + setTimeout(function (){ + location="/login.jsp?m=6015&d="+json.info.dbId; + },500); + }else if(json.info.msgType==6015){ //鍒锋柊褰撳墠椤甸潰 - location="/login.jsp"; + setTimeout(function (){ + location="/login.jsp"; + },500); + }else if(json.info.msgType==6002){ //鍙充笅瑙掑脊绐� - + //console.log('鎺ユ敹娑堟伅', json); + popMessage(json.info.msg); } // console.log('鎺ユ敹娑堟伅', json); } +} +var popflag=false; +function popMessage(message){ + var json=JSON.parse(message); + var message6002=""; + var colt=0; + var zong=1; + for(var i=0;i<json.length;i++){ + + if(json[i]["isPublicUser"]==1){ + funB6003(json[i]); + }else{ + message6002+=getMessage6002(json[i],colt,zong); + colt++; + zong++; + } + } + funB6002(message6002); +} +function messageToString(obj) { + if(obj==null) + return ""; + else + return obj+""; +} +function getMessage6002(entity,colt,zong) { + var message=""; + var Bcolor=""; + var messagetxt =entity["messagetxt"].replaceAll("(\\n|\\r|(\\r\\n)|(\u0085)|(\u2028)|(\u2029))",""); + if (colt % 2 == 0) { + Bcolor = "background:#FFFFFF;"; + } else { + Bcolor = "background:#DDDDDD;"; + } + if (entity["formid"] != undefined) { + message="<div style=" + Bcolor + "><a id="+entity["messid"]+" style=line-height:15pt;cursor:pointer;text-decoration:underline; onClick=funcLink('"+entity["formid"]+"','"+entity["formtype"]+"','"+messageToString(entity["origfields"]).replace("'", "")+"','"+messageToString(entity["linkfields"]).replace("'", "")+"','"+entity["linkmode"]+"','"+messageToString(entity["self_datafields"])+"','"+messageToString(entity["link_datafields"])+"','"+"','"+messageToString(entity["efilter"]).replace("'", "\\'")+"','"+"','"+"','"+"','"+"','"+"','"+entity["messid"]+",message');>"+zong + ": "+messagetxt+"</a></div>"; + } else if (entity["url"]!=undefined&&entity["url"]!="") { + var url = ""; + if (entity["url"].indexOf("http://")<0) { + url = "http://" + entity["url"]; + } else { + url = entity["url"]; + } + message="<div style=" + Bcolor + "><a style=line-height:15pt;cursor:pointer;text-decoration:underline; onClick=window.open('"+url+"')>"+zong + ": "+messagetxt+"</a></div>"; + } else { + message="<div style=" + Bcolor + "><a id="+entity["messid"]+" style=line-height:15pt;" + Bcolor + "cursor:pointer;>"+zong + ": "+messagetxt+"</a></div>"; + } + return message; +} +function funB6002(message){ + var init = $.cookie(userCode); + if(init==null){ + $.cookie(userCode,popflag); + } + if( $.cookie(userCode)=="false"){ + $.messagerTip.lays(300, 220); + $.messagerTip.show(0, message); + popflag= $("input[name='isTip']").is(":checked"); + $.cookie(userCode,popflag,{expires: 1}) + } +} +function funB6003(json) { + var messageType = json["messagetype"] ; + var myMessages = json["messagetxt"] ; + myMessages = myMessages.replace(/\t/g," "); + //鏇挎崲鎵�鏈夌殑鎹㈣绗� + myMessages = myMessages.replace(/\r\n/g,"<br>") + myMessages = myMessages.replace(/\n/g,"<br>"); + //鏇挎崲鎵�鏈夌殑绌烘牸锛堜腑鏂囩┖鏍笺�佽嫳鏂囩┖鏍奸兘浼氳鏇挎崲锛� + myMessages = myMessages.replace(/\s/g," "); + myMessages +="<br/><br/><hr/>" ; + myMessages += json["createusername"] + " " + + json["createtime"] ; + openToast(myMessages,json["topic"],messageType); } \ No newline at end of file diff --git a/src/com/yc/open/init/InitSystemTaks.java b/src/com/yc/open/init/InitSystemTaks.java index 1f946b0..888fe12 100644 --- a/src/com/yc/open/init/InitSystemTaks.java +++ b/src/com/yc/open/init/InitSystemTaks.java @@ -189,6 +189,9 @@ case "OP0044"://鍗ゆ睙鍗椾笂浼犻攢鍞暟鎹� createScheduleTask(dataSourceEntity, task, new KingDeeSchedule(dataSourceEntity,task)); break; + case "OP0050"://鍙充笅瑙掑脊绐楁樉绀� + createScheduleTask(dataSourceEntity, task, new MessagePopTipsSchedule(dataSourceEntity)); + break; default: break; } diff --git a/src/com/yc/open/init/shcedule/MessagePopTipsSchedule.java b/src/com/yc/open/init/shcedule/MessagePopTipsSchedule.java new file mode 100644 index 0000000..2c4ddeb --- /dev/null +++ b/src/com/yc/open/init/shcedule/MessagePopTipsSchedule.java @@ -0,0 +1,160 @@ +package com.yc.open.init.shcedule; + +import com.alibaba.fastjson.JSON; +import com.yc.action.grid.GridUtils; +import com.yc.entity.DataSourceEntity; +import com.yc.exception.ApplicationException; +import com.yc.factory.FactoryBean; +import com.yc.multiData.SpObserver; +import com.yc.sdk.WebSocketMessage.action.WebSocketMessageServer; +import com.yc.sdk.WebSocketMessage.entity.MessageInfo; +import com.yc.sdk.WebSocketMessage.entity.MessageType; +import com.yc.service.BaseService; +import org.springframework.jdbc.core.BeanPropertyRowMapper; + +import java.text.SimpleDateFormat; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +/** + * 瀹氭椂鏄剧ず鍙充笅瑙掑脊绐� + */ +public class MessagePopTipsSchedule extends BaseSchedule implements Runnable { + + public MessagePopTipsSchedule(DataSourceEntity dataSourceEntity) { + super(dataSourceEntity); + } + + @Override + public void run() { + try { + if (Thread.interrupted()) { + throw new InterruptedException(); + } + log.info(dataSourceEntity.getSystemDescribe() + "-寮�濮嬫墽琛屽彸涓嬭寮圭獥"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + SpObserver.setDBtoInstance("_" + dataSourceEntity.getDbId()); + BaseService baseService= (BaseService) FactoryBean.getBean("BaseService"); + final List<MessageTipsEntity> list = baseService.getJdbcTemplate().query("set nocount on ; exec p9912V4", new BeanPropertyRowMapper<>(MessageTipsEntity.class)); + if(list!=null&&list.size()>0){ + list.stream().unordered().distinct().forEach(x->{ + //鍙栨瘡涓�涓敤鎴风殑鎵�鏈夋秷鎭� + String userCode=x.getUsercode(); + //--鍒嗕簩绉嶆秷鎭被鍨嬶紝1鍙充笅瑙掑脊绐�,2绯荤粺绾ф秷鎭樉绀� + + final List<MessageTipsEntity> collect = list.stream().filter(y -> y.getUsercode().equalsIgnoreCase(x.getUsercode())).collect(Collectors.toList()); + + if(collect!=null&&collect.size()>0){ + /*int colt=0; + int zong=1; + String Bcolor=""; + StringBuffer message = new StringBuffer(); + for( MessageTipsEntity entity:collect) { + + if(entity.getIsPublicUser()!=null||entity.getIsPublicUser()==1){ + //---绯荤粺绾ф秷鎭洿鎺ユ湁涓�鏉″氨鍙戦�佷竴鏉� + pushSystemMessage(entity,sdf); + continue; + } + //---鍙充笅瑙掓秷鎭紝缁勮鍐嶅彂閫� + String messagetxt = this.replaceBlank(entity.getMessagetxt()); + if (colt % 2 == 0) { + Bcolor = "background:#FFFFFF;"; + } else { + Bcolor = "background:#DDDDDD;"; + } + if (entity.getFormid() != null) { + message.append("<div style=" + Bcolor + "><a id=").append(entity.getMessid()).append(" style=line-height:15pt;cursor:pointer;text-decoration:underline; onClick=funcLink('").append(entity.getFormid()) + .append("','").append(entity.getFormtype()).append("','").append(toString(entity.getOrigfields()).replace("'", "")).append("','").append(toString(entity.getLinkfields()).replace("'", "")).append("','").append(entity.getLinkmode()).append("','").append(entity.getSelf_datafields()) + .append("','").append(entity.getLink_datafields()).append("','") + .append("','").append(toString(entity.getEfilter()).replace("'", "\\'")) + .append("','") + .append("','") + .append("','") + .append("','") + .append("','") + .append("','").append(entity.getMessid()).append(",message');>").append(zong + ": ").append(messagetxt).append("</a></div>"); + } else if (StringUtils.isNotBlank(entity.getUrl())) { + String url = ""; + if (entity.getUrl().contains("http://") == false) { + url = "http://" + entity.getUrl(); + } else { + url = entity.getUrl(); + } + message.append("<div style=" + Bcolor + "><a style=line-height:15pt;cursor:pointer;text-decoration:underline; onClick=window.open('") + .append(url).append("')>") + .append(zong + ": ") + .append(messagetxt).append("</a></div>"); + } else { + message.append("<div style=" + Bcolor + "><a id=").append(entity.getMessid()) + .append(" style=line-height:15pt;" + Bcolor + "cursor:pointer;>") + .append(zong + ": ") + .append(messagetxt).append("</a></div>"); + } + colt++; + zong++; + + + }*/ + //----鍙戦�佸嚭鍘� + //---閫氱煡webscoket + MessageInfo messageInfo = new MessageInfo(); + messageInfo.setDbId(dataSourceEntity.getDbId()); + messageInfo.setMsgType(MessageType.NOTICE_AND_TODO); + messageInfo.setUserFromType("1");//TODO PC绔� + messageInfo.setUserCode(userCode); + messageInfo.setMsg(GridUtils.toJson(collect)); + WebSocketMessageServer.publishMessageToRedis(messageInfo); + }; + }); + } + log.info(dataSourceEntity.getSystemDescribe() + "-鍙充笅瑙掑脊绐椾换鍔″畬鎴�"); + } catch (InterruptedException ex) { + log.info(dataSourceEntity.getSystemID() + "鍙充笅瑙掑脊绐椾换鍔″凡琚粓姝�"); + } catch (Exception ex) { + ex.printStackTrace(); + log.error(dataSourceEntity.getSystemDescribe() + ":" + ex.getMessage()); + }finally { + SpObserver.setDBtoInstance(); + } + } + + private void pushSystemMessage(MessageTipsEntity entity,SimpleDateFormat sdf) { + Map map=new HashMap(); + map.put("messagetxt",entity.getMessagetxt()); + map.put("unvaliddate",sdf.format(toString(entity.getUnvaliddate()))); + map.put("createtime",sdf.format(toString(entity.getCreatetime()))); + map.put("createusername",entity.getCreateusername()); + map.put("topic",entity.getTopic()); + map.put("messagetype",entity.getMessagetype()); + //---閫氱煡webscoket + MessageInfo messageInfo = new MessageInfo(); + messageInfo.setDbId(dataSourceEntity.getDbId()); + messageInfo.setMsgType(MessageType.POPUP_REMINDER); + messageInfo.setUserFromType("1");//TODO PC绔� + messageInfo.setUserCode(entity.getUsercode()); + messageInfo.setMsg(JSON.toJSONString(map)); + WebSocketMessageServer.publishMessageToRedis(messageInfo); + } + + public String replaceBlank(String str) { + if (str == null || str == "") { return ""; } + Matcher m = null; + try { + Pattern p = Pattern.compile("\t|\r|\n"); + m = p.matcher(str); + } catch (Exception e) { + e.printStackTrace(); + throw new ApplicationException(str + "-瑙f瀽鍑洪敊锛屽瓨鍦ㄦ湁鐗规畩瀛楃"); + } + return m.replaceAll(" ").replaceAll("\\$", "\\\\\\$"); + } + public static String toString(Object obj){ + if(obj==null)return ""; + return obj.toString(); + } +} \ No newline at end of file diff --git a/src/com/yc/open/init/shcedule/MessageTipsEntity.java b/src/com/yc/open/init/shcedule/MessageTipsEntity.java new file mode 100644 index 0000000..4023bf4 --- /dev/null +++ b/src/com/yc/open/init/shcedule/MessageTipsEntity.java @@ -0,0 +1,45 @@ +package com.yc.open.init.shcedule; + +import lombok.Data; + +@Data +public class MessageTipsEntity { + Integer messid ; + String messagetxt ; + String unvaliddate ; + String createuser; + String createtime ; + Integer rejustsrvflag; + String Readers ; + String UsrReaded; + Integer tipcount; + Integer formid; + Integer formtype; + String origfields; + String linkfields; + Integer linkmode; + String self_datafields; + String link_datafields; + String efilter; + String usercode ; + String url; + String createusername; + String topic; + String messagetype; + Integer isPublicUser; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + MessageTipsEntity that = (MessageTipsEntity) o; + + return usercode.equals(that.usercode); + } + + @Override + public int hashCode() { + return usercode.hashCode(); + } +} diff --git a/src/com/yc/sdk/WebSocketMessage/action/WebSocketMessageServer.java b/src/com/yc/sdk/WebSocketMessage/action/WebSocketMessageServer.java index a45fd85..d1e9f8d 100644 --- a/src/com/yc/sdk/WebSocketMessage/action/WebSocketMessageServer.java +++ b/src/com/yc/sdk/WebSocketMessage/action/WebSocketMessageServer.java @@ -160,19 +160,21 @@ } return wsMessageUserList; } - /** - * 鍏蜂綋涓�涓細璇濈敤鎴� + * 鏍规嵁 dbid,userCocde鍙栧嚭瀵瑰簲鐨勭敤鎴�(鍖呮嫭鎵�鏈夌鐨勭敤鎴凤紝PC绔�,APP绔�) * @param dbId - * @param userFromType * @param userCode - * @param sessionId * @return */ - public static WsMessageUserEntity getOnlineUser(Integer dbId, String userFromType,String userCode,String sessionId) { - return onlineUserList.get(RedisSocket.CHANEL_WS_MESSAGES + ":" + dbId + ":" + userFromType + ":" + userCode+":"+sessionId); + public static List<WsMessageUserEntity> getOnlineUserByTips(Integer dbId, String userCode) { + List<WsMessageUserEntity> wsMessageUserList = new ArrayList<WsMessageUserEntity>(); + for(Map.Entry<String, WsMessageUserEntity> entry:onlineUserList.entrySet()){ + if (entry.getKey().startsWith(RedisSocket.CHANEL_WS_MESSAGES + ":" + dbId)&&entry.getKey().contains(":"+userCode+":")) { + wsMessageUserList.add(entry.getValue()) ; + } + } + return wsMessageUserList; } - /** * 鍙栧悓涓�涓郴缁熺殑鎵�鏈夌敤鎴� * @param dbId @@ -185,9 +187,7 @@ if (entry.getKey().startsWith(RedisSocket.CHANEL_WS_MESSAGES + ":" + dbId + ":" + (StringUtils.isNotBlank(userFromType)?(userFromType + ":"):""))) { wsMessageUserList.add(entry.getValue()) ; } - //System.out.println(entry.getKey()+"--->"+entry.getValue()); } - // return onlineUserList.get(RedisSocket.CHANEL_WS_MESSAGES + ":" + dbId + ":" + userFromType + ":" + userCode); return wsMessageUserList; } diff --git a/src/com/yc/sdk/WebSocketMessage/api/messagelistener/WebSocketMessageListener.java b/src/com/yc/sdk/WebSocketMessage/api/messagelistener/WebSocketMessageListener.java index f4a6104..b53be82 100644 --- a/src/com/yc/sdk/WebSocketMessage/api/messagelistener/WebSocketMessageListener.java +++ b/src/com/yc/sdk/WebSocketMessage/api/messagelistener/WebSocketMessageListener.java @@ -65,11 +65,21 @@ handlerMessage(msg, wsMessageUserEntity); } } - } else if (msg.getMsgType().equals(MessageType.REFRESH_TASK) || - msg.getMsgType().equals(MessageType.REFRESH_LOCALVERSION_TASK)) { + } else if (MessageType.REFRESH_TASK.equals(msg.getMsgType()) || + MessageType.REFRESH_LOCALVERSION_TASK.equals(msg.getMsgType())|| + MessageType.CHECK_SYSTEM_DISABLED.equals(msg.getMsgType()) + ) { //瀵逛簬娌$敤websocket鎺ユ敹鐨勬儏鍐碉紝鐩存帴澶勭悊鐩稿叧娑堟伅 handlerMessage(msg, null); + }else if(MessageType.POPUP_REMINDER.equals(msg.getMsgType())||MessageType.NOTICE_AND_TODO.equals(msg.getMsgType())){ + //--澶勭悊鍙充笅瑙掑脊绐楀強绯荤粺绾х殑娑堟伅 + List<WsMessageUserEntity> wsMessageUserEntityList = WebSocketMessageServer.getOnlineUserByTips(msg.getDbId(), msg.getUserCode()); + if (wsMessageUserEntityList != null && wsMessageUserEntityList.size() != 0) { + for (WsMessageUserEntity wsMessageUserEntity : wsMessageUserEntityList) { + handlerMessage(msg, wsMessageUserEntity); + } + } } else { List<WsMessageUserEntity> wsMessageUserEntityList = WebSocketMessageServer.getOnlineUser(msg.getDbId(), msg.getUserFromType(), msg.getUserCode()); //鍙湁鏄瓨鍦ㄤ簬褰撳墠鐨勭敤鎴蜂俊鎭墠闇�瑕佸鐞嗭紝鍚﹀垯涓嶉渶瑕佸鐞� @@ -96,11 +106,9 @@ case 6001: //APP鎵爜鐧诲綍 // messageIfc=imMessageIfc; break; - case 6002: //寰呭姙浜嬪疁锛圥C绔彸涓嬭锛孉PP绔疄鏃跺脊鍑烘彁閱掞級 - //messageIfc=imMessageIfc; - break; + case 6002: //寰呭姙浜嬪疁锛圥C绔彸涓嬭锛� case 6003: //绯荤粺绾у脊绐椾俊鎭紙瑕侀伩鍏嶉珮瀵嗗害閲嶅寮瑰嚭锛� - //messageIfc=imMessageIfc; + messageIfc=imMessageIfc; break; case 6004: //鏀跺彇鏈嶅姟璐圭画璐归�氱煡 //messageIfc=imMessageIfc; diff --git a/src/com/yc/sdk/WebSocketMessage/entity/MessageType.java b/src/com/yc/sdk/WebSocketMessage/entity/MessageType.java index ffdc620..a99ffcf 100644 --- a/src/com/yc/sdk/WebSocketMessage/entity/MessageType.java +++ b/src/com/yc/sdk/WebSocketMessage/entity/MessageType.java @@ -3,7 +3,7 @@ public class MessageType { public final static Integer APP_QRCODE_LOGIN=6001; //APP鎵爜鐧诲綍 public final static Integer NOTICE_AND_TODO=6002; //寰呭姙浜嬪疁锛圥C绔彸涓嬭锛孉PP绔疄鏃跺脊鍑烘彁閱掞級 - public final static Integer POPUPREMINDER=6003; //绯荤粺绾у脊绐椾俊鎭紙瑕侀伩鍏嶉珮瀵嗗害閲嶅寮瑰嚭锛� + public final static Integer POPUP_REMINDER=6003; //绯荤粺绾у脊绐椾俊鎭紙瑕侀伩鍏嶉珮瀵嗗害閲嶅寮瑰嚭锛� public final static Integer SERVICE_CHARGE =6004; //鏀跺彇鏈嶅姟璐圭画璐归�氱煡 public final static Integer CHECK_SYSTEM_DISABLED=6005; //妫�鏌ョ郴缁熸槸鍚﹀仠鐢紝浠f浛maintaince.do public final static Integer MINI_APP_VERIFYING=6006; //灏忕▼搴忔壂鐮佹牳閿�锛堟壂鐮佸悗绛夊緟鐐瑰嚮鏍搁攢鎸夐挳锛� -- Gitblit v1.8.0