; !function (win, undefined) { var config = { aniTime: 200, hosts: (function () { var dk = location.href.match(/\:\d+/); dk = dk ? dk[0] : ''; return 'http://' + document.domain + dk + '/'; })(), json: function (url, data, callback, error) { return $.ajax({ type: 'POST', url: url, data: data, dataType: 'json', success: callback, error: error }); }, stopMP: function (e) { e ? e.stopPropagation() : e.cancelBubble = true; }, unreadmsg: 0, historymsg: [], layerIndex: 0 }, dom = [$(window), $(document), $('html'), $('body')], chatCore = {}, systemHub = $.connection.chatHub; //构造弹出界面 chatCore.popchat = function (data) { var strHtml = '
'; if ($("#popchat_layer").length === 0) { config.layerIndex = layer.open({ type: 1, id: "popchat_layer", skin: "dark_title", title: ["消息提醒", "height: 32px;line-height: 32px;"], anim: -1, move: false, shade: false, closeBtn: false, area: ['230px', '320px'], content: strHtml, btn: false, success: function (layero) { $(".message-box-div button.action").find("i").addClass("icon-minus"); $(".message-box-div button.action").find("i").removeClass("icon-envelope"); $(layero).on('click', '.icon-refresh', function () { chatCore.gethistorymsg(layero); }); chatCore.chatbox = layero.find('#ChatCore_chatbox'); //填充历史消息 if (config.historymsg.length === 0) chatCore.gethistorymsg(layero); else { chatCore.callback(layero, config.historymsg); } } }); } else { $("#popchat_layer").find("ul").prepend(chatCore.builditem(data)); } }; //获取历史提醒 chatCore.gethistorymsg = function (layero) { $(layero).find('.icon-refresh').addClass('icon-spin'); //等待窗口 CommonAjax.Post("/SoftMng/SignalR/GetHistoryMsg", { userid: userid }, function (data) { setTimeout(function () { $(layero).find('.icon-refresh').removeClass('icon-spin'); }, 3000); config.historymsg = data; chatCore.callback(layero, config.historymsg); }); }; //回调 chatCore.callback = function (layero, data) { $(layero).find("ul").html(chatCore.builditem(data)); config.historymsg = data; config.unreadmsg = data.filter(function (item) { return !item.ISREAD; }).length; chatCore.ChatCoreNode.find(".badge").show().text(config.unreadmsg); //绑定事件 $('.list-group-item > span.icon-bell-alt').on('click', function () { var $othis = $(this); var key = $othis.attr("data-key"); CommonAjax.Post("/SoftMng/SignalR/SetMsgStatus", { gid: key, status: 1 }, function (result) { if (result) { var index = config.historymsg.findIndex(function (item) { return item.GID == key; }); //减少未读 config.unreadmsg--; console.log(config.unreadmsg) chatCore.ChatCoreNode.find(".badge").show().text(config.unreadmsg); if (config.unreadmsg === 0) chatCore.ChatCoreNode.find(".badge").hide(); config.historymsg[index].ISREAD = 1; chatCore.callback(layero, config.historymsg); } }); }); }; //构造提醒列表 chatCore.builditem = function (data) { var str = ""; for (var i = 0; i < data.length; i++) { str = str.concat( '
  • ' + CommonJson.GetDate(data[i].CREATETIME).format('yyyy-mm-dd hh:ii') + '

    ' + data[i].MESSAGECONTENT + '

  • '); } return str; }; //所有事件 chatCore.event = function () { $('.message-box-div button.action').on('click', function () { if (chatCore.moved != undefined && chatCore.moved) { chatCore.moved = false; return; } if ($(this).find("i").hasClass("icon-envelope")) { $(this).find("i").addClass("icon-minus"); $(this).find("i").removeClass("icon-envelope"); chatCore.popchat(); } else { $(this).find("i").addClass("icon-envelope"); $(this).find("i").removeClass("icon-minus"); layer.close(config.layerIndex); } }); $('.message-box-div').on('mousedown', function (e) { chatCore.downY = e.clientY; chatCore.srcBottom = parseInt($('.message-box-div').css("bottom").replace("px", "")); console.debug("srcBottom:" + chatCore.srcBottom); }) .on('mousemove', function (e) { if (e.buttons == 1) { chatCore.moved = true; var chgY = chatCore.downY - e.clientY; var newBottom = chatCore.srcBottom + chgY; console.debug("newBottom:" + newBottom); $('.message-box-div').css("bottom", newBottom + "px") console.debug($('.message-box-div').css("bottom")); } }); //连接IM服务器 systemHub.client.onConnected = function (id, userName, allUsers) { //获取未读消息总数 CommonAjax.Post("/SoftMng/SignalR/GetHistoryMsg", { userid: userid }, function (data) { config.historymsg = data; config.unreadmsg = data.filter(function (item) { return !item.ISREAD; }).length; chatCore.ChatCoreNode.find(".badge").show().text(config.unreadmsg); }); }; //发送消息时,对方已不在线 systemHub.client.absentSubscriber = function () { console.warn("消息已被阻止,对方设置拒绝接收!"); }; //接收消息 systemHub.client.receivePrivateMessage = function (connnectId, userName, data) { console.debug("rec"); data.LASTREADTIME = "/Date(" + new Date(data.LASTREADTIME).valueOf() + ")/"; data.CREATETIME = "/Date(" + new Date(data.CREATETIME).valueOf() + ")/"; config.unreadmsg++; chatCore.ChatCoreNode.find(".badge").show().text(config.unreadmsg); config.historymsg.unshift(data); var arr = new Array(); arr.push(data); //右下角提醒 layer.msg(data.DESCRIPTION, { icon: 1, time: 5000, offset: "rb", skin: "col-point", closeBtn: 1, success: function (layero, index) { $(layero).on("click", ".layui-layer-content", function () { chatCore.popchat(arr); layer.close(index); }); } }); //var log = {}; //log.imarea.scrollTop(log.imarea[0].scrollHeight); }; //接收公告 systemHub.client.receiveNotice = function (model, action) { var notice = $("#notice", document.getElementsByTagName("iframe").main.contentWindow.document); if (action != "delete") {//新增或修改 var html = '
  • '; html += '' + model.Title + ''; html += '
    '; html += ''; html += model.CreateTime; html += '
  • ' if (action == "update") notice.find("[data-id='" + model.GID + "']").remove(); notice.prepend(html); } else {//删除操作 var delItem = model.split(','); for (var i = 0; i < delItem.length; i++) { notice.find("[data-id=" + delItem[i] + "]").remove(); } } }; }; //渲染骨架 chatCore.view = (function () { var ChatCoreNode = chatCore.ChatCoreNode = $('
    ' + config.unreadmsg + '
    '); dom[3].append(ChatCoreNode); if (config.unreadmsg === 0) chatCore.ChatCoreNode.find(".badge").hide(); chatCore.event(); //启动连接 $.connection.hub.start().done(function () { systemHub.server.connect(userid, username, userface); }).fail(function (res) { layer.msg(res); }); }()); }(window);