fs-danaus
2022-07-16 c6121771842e38e380b2bdd2017b975067875e12
完善右下角弹窗及抄送我的功能
6个文件已修改
296 ■■■■■ 已修改文件
src/com/yc/ionic/action/WebMenuAction.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/com/yc/ionic/service/AppIfc.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/com/yc/ionic/service/AppImpl.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/com/yc/open/init/shcedule/MessagePopTipsSchedule.java 117 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/com/yc/sdk/WebSocketMessage/api/messagelistener/WebSocketMessageListener.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/com/yc/sdk/WebSocketMessage/entity/WsMessageUserEntity.java 25 ●●●● 补丁 | 查看 | 原始文档 | 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()){