src/com/yc/ionic/action/WebMenuAction.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/com/yc/ionic/service/AppIfc.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/com/yc/ionic/service/AppImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/com/yc/open/init/shcedule/MessagePopTipsSchedule.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/com/yc/sdk/WebSocketMessage/api/messagelistener/WebSocketMessageListener.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/com/yc/sdk/WebSocketMessage/entity/WsMessageUserEntity.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/com/yc/ionic/action/WebMenuAction.java
@@ -1,45 +1,37 @@ package com.yc.ionic.action; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.google.gson.GsonBuilder; import com.yc.action.BaseAction; import com.yc.action.grid.GridUtils; import com.yc.entity.DataSourceEntity; import com.yc.exception.ApplicationException; import com.yc.factory.FactoryBean; import com.yc.ionic.entity.MessageParameter; import com.yc.service.BaseService; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import com.google.gson.GsonBuilder; import com.yc.action.BaseAction; import com.yc.action.grid.GridUtils; import com.yc.entity.DataSourceEntity; import com.yc.ionic.service.AppIfc; import com.yc.multiData.MultiDataSource; import com.yc.multiData.SpObserver; import com.yc.sdk.shopping.util.SettingKey; import com.yc.sdk.weixincp3rd.entity.SuiteComponentAppEntity; import com.yc.sdk.weixincp3rd.entity.SuiteComponentAppSetting; import com.yc.service.BaseService; import com.yc.service.oapanel.WebMenuAccessIfc; import com.yc.service.webmenu.WebMenuIfc; import com.yc.utils.EncodeUtil; import com.yc.utils.SessionKey; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** @@ -145,24 +137,7 @@ if (appCode != null && !"".equals(appCode)) { //第三方托管写法 SuiteComponentAppEntity suiteComponentApp = SuiteComponentAppSetting.getSuiteComponentAppEntityByAppCode(appCode); /* if (suiteComponentApp == null) { System.err.println("未找到企业号应用AppCode【"+appCode+ "】,请检查wx-suite-component-setting.xml文件设置是否正确? "); this.printJson(response, "{\"error\":\"" + "未找到企业号应用AppCode【"+appCode+ "】,请检查wx-suite-component-setting.xml文件设置是否正确? " + "\"}"); return ; } WxCpService wxCpService = CpServiceInit.getWxCpService(corpEntity.getCorpId(),appCode) ; if (wxCpService==null) { System.err.println("未找到企业号应用AppCode【"+appCode+ "】,请检查wx-suite-component-setting.xml文件设置是否正确? 同时请检查该企业号是否被第三方正确授权?企业号CorpId【"+ corpEntity.getCorpId()+"】"); this.printJson(response, "{\"error\":\"" + "未找到企业号应用AppCode【"+appCode+ "】,请检查wx-suite-component-setting.xml文件设置是否正确? 同时请检查该企业号是否被第三方正确授权?企业号CorpId【"+ corpEntity.getCorpId()+"】" + "\"}"); return ; } App3rdEntity app3rdEntity = CpServiceInit.getApp3rdEntity(suiteComponentApp.getSuiteId(),corpEntity.getCorpId(),suiteComponentApp.getSuiteDbId()); if (app3rdEntity==null) { System.err.println("没有找到该企业号的第三方授权信息,请重新为该企业号授权。企业号应用AppCode【"+appCode+ "】,第三方应用SuiteId【"+suiteComponentApp.getSuiteId()+"】,企业号CorpId【"+ corpEntity.getCorpId()+"】,第三方数据源【"+ suiteComponentApp.getSuiteDbId()+"】"); this.printJson(response, "{\"error\":\"" + "没有找到该企业号的第三方授权信息,请重新为该企业号授权。企业号应用AppCode【"+appCode+ "】,第三方应用SuiteId【"+suiteComponentApp.getSuiteId()+"】,企业号CorpId【"+ corpEntity.getCorpId()+"】,第三方数据源【"+ suiteComponentApp.getSuiteDbId()+"】" + "\"}"); return ; }*/ if (suiteComponentApp != null) { redirectDomain = suiteComponentApp.getSuiteAuthDomain(); } @@ -304,7 +279,24 @@ SpObserver.setDBtoInstance(); } } @RequestMapping(params = "m=msgNumV2") @ResponseBody public Object getMessageNumV2(HttpServletRequest request, HttpServletResponse response) { try { SpObserver.setDBtoInstance("_" + request.getSession().getAttribute(SessionKey.DATA_BASE_ID)); List<Map<String, Object>> list = appIfc.getMessageByUserCodeNumV2(request.getSession().getAttribute(SessionKey.USERCODE)+""); Map resultMap=new HashMap(); resultMap.put("count",((list==null&&list.size()==0)?null:list.get(0).get("msgCount"))); resultMap.put("list",list); return resultMap; } catch (Exception ex) { Map resultMap=new HashMap(); resultMap.put("error",this.getErrorMsg(ex)); return resultMap; } finally { SpObserver.setDBtoInstance(); } } @RequestMapping(params = "m=read") public void setMsg2Read(String unid, HttpServletRequest request, HttpServletResponse response) {//修改待办事宜为已读状态 try { src/com/yc/ionic/service/AppIfc.java
@@ -37,6 +37,7 @@ public List<Map<String, Object>> getMessageByUserCodeV2(MessageParameter messageParameter); //未读待办事宜的记录数 public List<Map<String, Object>> getMessageByUserCodeNum(String usercode); public List<Map<String, Object>> getMessageByUserCodeNumV2(String usercode); /** * 更新为已推送 */ src/com/yc/ionic/service/AppImpl.java
@@ -168,6 +168,50 @@ " select @ActionCount=count(1) \n" + " from t219001 a with (nolock) \n" + " where a.UserCode =@userCode\n" + " and a.actiontype ='抄送' and a.curstatus = 'Undone'\n" + " set @MsgCount=isnull(@MsgCount,0)+isnull(@ActionCount,0)\n" + " set @todoCount=isnull(@todoCount,0)+isnull(@ActionCount,0)\n" + " insert into @table(ActionType,ActionCount)values('抄送',@ActionCount)\n" + " select @ActionCount=count(1)\n" + " from t219001 a with (nolock)\n" + " where a.UserCode =@userCode \n" + " and a.actiontype = '通知' and isnull(a.isRead,0)=0\n" + " set @MsgCount=isnull(@MsgCount,0)+isnull(@ActionCount,0)\n" + " insert into @table(ActionType,ActionCount)values('通知',@ActionCount)\n" + " select @ActionCount=count(1)\n" + " from t219001 a with (nolock)\n" + " where a.UserCode =@userCode\n" + " and a.actiontype = '在线交流' and isnull(a.isRead,0)=0\n" + " set @MsgCount=isnull(@MsgCount,0)+isnull(@ActionCount,0)\n" + " insert into @table(ActionType,ActionCount)values('在线交流',@ActionCount)\n" + " select @MsgCount as msgCount,@todoCount as todoCount ,a.ActionType,a.ActionCount \n" + " from @table a "; return this.jdbcTemplate.queryForList(sql,usercode); } @Override public List<Map<String, Object>> getMessageByUserCodeNumV2(String usercode) { // String sql = "set nocount on \n select Count(1) as msgCount from t219001 a where curstatus = 'Undone' and ActionType in ('审核','抄送','在线交流','通知') and UserCode =?"; String sql="set nocount on \n" + " declare @userCode varchar(50)=?\n" + " declare @table table(ActionType varchar(50),ActionCount int) \n" + " declare @MsgCount int \n" + " declare @ActionCount int \n" + " declare @todoCount int \n" + " select @ActionCount=count(1) \n" + " from t219001 a with (nolock) \n" + " where a.UserCode =@userCode\n" + " and a.actiontype ='审核' and a.curstatus = 'Undone'\n" + " set @MsgCount=isnull(@MsgCount,0)+isnull(@ActionCount,0)\n" + " set @todoCount=isnull(@todoCount,0)+isnull(@ActionCount,0)\n" + " insert into @table(ActionType,ActionCount)values('审核',@ActionCount)\n" + " select @ActionCount=count(1) \n" + " from t219001 a with (nolock) \n" + " where a.UserCode =@userCode\n" + " and a.actiontype ='抄送' \n" + " set @MsgCount=isnull(@MsgCount,0)+isnull(@ActionCount,0)\n" + " set @todoCount=isnull(@todoCount,0)+isnull(@ActionCount,0)\n" + @@ -191,7 +235,6 @@ " from @table a "; return this.jdbcTemplate.queryForList(sql,usercode); } @Override public int updatePush(String uuid) { src/com/yc/open/init/shcedule/MessagePopTipsSchedule.java
@@ -9,6 +9,7 @@ import com.yc.sdk.WebSocketMessage.action.WebSocketMessageServer; import com.yc.sdk.WebSocketMessage.entity.MessageInfo; import com.yc.sdk.WebSocketMessage.entity.MessageType; import com.yc.sdk.WebSocketMessage.entity.WsMessageUserEntity; import com.yc.service.BaseService; import org.springframework.jdbc.core.BeanPropertyRowMapper; @@ -16,6 +17,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.StringJoiner; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -35,71 +37,36 @@ 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->{ BaseService baseService = (BaseService) FactoryBean.getBean("BaseService"); //获取当前已连接webscoket的用户 final List<WsMessageUserEntity> onlineUser = WebSocketMessageServer.getOnlineUser(dataSourceEntity.getDbId(), null); StringJoiner joiner = new StringJoiner(","); if (onlineUser != null && onlineUser.size() > 0){ for(WsMessageUserEntity entity:onlineUser){ joiner.add(entity.getUserCode()); } final List<MessageTipsEntity> list = baseService.getJdbcTemplate().query("set nocount on ; declare @UserCodes varchar(max) =" +GridUtils.prossSqlParm(joiner.toString())+ "\n select a.messid,a.messagetxt,a.unvaliddate,a.createuser,a.createtime,\n" + " a.rejustsrvflag,a.Readers,a.UsrReaded,a.tipcount,a.formid,\n" + " a.formtype,a.origfields,a.linkfields,a.linkmode,a.self_datafields,\n" + " a.link_datafields,a.efilter , b.usercode ,a.url ,\n" + " a.createusername ,a.topic ,a.messagetype ,a.isPublicUser\n" + " from _sysMessageCount b \n" + " join _sysmessage a on a.messid = b.messid\n" + " where b.usercode in (select list from getinstr(@UserCodes)) \n" + " and b.tipcount < a.tipcount\n" + " and a.unvaliddate >= getdate() \n" + " and b.isRead = 0 ", new BeanPropertyRowMapper<>(MessageTipsEntity.class)); if (list != null && list.size() > 0) { final StringJoiner updateJoiner=new StringJoiner("\n"); list.stream().unordered().distinct().forEach(x -> { //取每一个用户的所有消息 String userCode=x.getUsercode(); 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++; }*/ if (collect != null && collect.size() > 0) { //----发送出去 //---通知webscoket MessageInfo messageInfo = new MessageInfo(); @@ -108,11 +75,35 @@ messageInfo.setUserFromType("1");//TODO PC端 messageInfo.setUserCode(userCode); messageInfo.setMsg(GridUtils.toJson(collect)); WebSocketMessageServer.publishMessageToRedis(messageInfo); }; //直接发送 List<WsMessageUserEntity> wsMessageUserEntityList = WebSocketMessageServer.getOnlineUserByTips(dataSourceEntity.getDbId(), userCode); if (wsMessageUserEntityList != null && wsMessageUserEntityList.size() != 0) { for (WsMessageUserEntity wsMessageUserEntity : wsMessageUserEntityList) { boolean flag= wsMessageUserEntity.sendMessageV3(messageInfo); if(flag){ //成功才更新次数 collect.stream().forEach(z->{ updateJoiner.add(" insert into @table(MessId,UserCode) values ( "+z.getMessid()+","+GridUtils.prossSqlParm(userCode)+")"); }); } } } } }); //---更新次数 if(updateJoiner.length()>0) { String sql = "set nocount on \n declare @table table(MessId int,UserCode varchar(50), Primary Key(MessId,UserCode))\n" + updateJoiner.toString() + " \n update a set tipcount = isnull(tipcount,0) + 1 \n" + " from _sysMessageCount a \n" + "where exists ( select 1 from @table b where a.MessId = b.MessId and a.UserCode = b.UserCode ) "; baseService.getSimpleJdbcTemplate().execute(sql); } } log.info(dataSourceEntity.getSystemDescribe() + "-右下角弹窗任务完成"); } } catch (InterruptedException ex) { log.info(dataSourceEntity.getSystemID() + "右下角弹窗任务已被终止"); } catch (Exception ex) { src/com/yc/sdk/WebSocketMessage/api/messagelistener/WebSocketMessageListener.java
@@ -72,14 +72,6 @@ //对于没用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()); //只有是存在于当前的用户信息才需要处理,否则不需要处理 @@ -103,16 +95,16 @@ MessageIfc messageIfc = null; if (message != null && message.getMsgType() != null) { switch (message.getMsgType()) { case 6001: //APP扫码登录 // messageIfc=imMessageIfc; break; case 6002: //待办事宜(PC端右下角) case 6003: //系统级弹窗信息(要避免高密度重复弹出) messageIfc=imMessageIfc; break; case 6004: //收取服务费续费通知 //messageIfc=imMessageIfc; break; // case 6001: //APP扫码登录 // // messageIfc=imMessageIfc; // break; // case 6002: //待办事宜(PC端右下角) // case 6003: //系统级弹窗信息(要避免高密度重复弹出) // messageIfc=imMessageIfc; // break; // case 6004: //收取服务费续费通知 // //messageIfc=imMessageIfc; // break; case 6005: //检查系统是否停用,代替maintaince.do case 6014: //关闭系统通知 case 6015: //启用系统通知 src/com/yc/sdk/WebSocketMessage/entity/WsMessageUserEntity.java
@@ -1,13 +1,11 @@ package com.yc.sdk.WebSocketMessage.entity; import javax.websocket.Session; import com.alibaba.fastjson.JSON; import com.yc.action.grid.GridUtils; import com.yc.im.action.WebSocketIMServer; import lombok.Getter; import lombok.Setter; import javax.websocket.Session; @Setter @Getter @@ -40,6 +38,25 @@ } } } public boolean sendMessageV3(MessageInfo message){ if (!this.session.isOpen()){ return false; } synchronized (this.session) { CallBackMessage info = new CallBackMessage(); message.setDbId(this.getDbId()); info.setInfo(message); try { this.session.getBasicRemote().sendText(JSON.toJSONString(info));//用异步发送 return true; } catch (Exception e) { e.printStackTrace(); WebSocketIMServer.printError(e,this.session); return false; } } } public void sendMessageV2(Object message){ if (!this.session.isOpen()){