/// <summary>
        /// 群主-加人
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public object GM_AddUsers(IGM_AddUsers model)
        {
            var mOGM_AddUsers = new OGM_AddUsers();
            var group         = new IM_Group();
            var users_add     = new List <IM_User>();

            var db_result = 0;

            using (var db = new ModelAC())
            {
                #region db
                group = db.IM_Group.SingleOrDefault(p => p.App_Id == APP_GUID && p.GroupId == model.GroupId);

                users_add = db.IM_User.Where(p => p.App_Id == APP_GUID && model.Accounts.Contains(p.UserId)).ToList();

                foreach (var user in users_add)
                {
                    var mIm_UserGroup = new Im_UserGroup();
                    mIm_UserGroup.IM_User_Id    = user.Id;
                    mIm_UserGroup.IM_Group_Id   = group.Id;
                    mIm_UserGroup.GroupPosition = IM_GroupPosition.Memeber;
                    db.Im_UserGroup.Add(mIm_UserGroup);
                }

                db_result = db.SaveChanges();
                #endregion
            }

            if (db_result > 0)
            {
                mOGM_AddUsers.Success = true;
                mOGM_AddUsers.Msg     = "添加群成员成功!";

                #region 连接组维护
                var app_accounts  = users_add.Select(p => HubKey.App__Account(app: APP, account: p.UserId)).ToList();
                var connectionIDs = Base_GetConnectionIds(app_accounts);

                foreach (var connectionId in connectionIDs)
                {
                    //将连接添加到指定的组
                    Groups.Add(connectionId, group.Id.ToString());
                }
                #endregion

                #region 更新相关群组聊表信息-发送系统通知
                Update_GM_AddUsers(group);
                #endregion

                return(CommonJson.camelObject(mOGM_AddUsers));
            }
            else
            {
                mOGM_AddUsers.Success = false;
                mOGM_AddUsers.Msg     = "添加群成员失败!";

                return(CommonJson.camelObject(mOGM_AddUsers));
            }
        }
        /// <summary>
        /// 发送-图片消息
        /// </summary>
        /// <returns></returns>
        public object Group_SendPicture(IGroup_SendText model)
        {
            var user      = LOGIN_USER;
            var msg       = new IM_MsgGroup();
            var db_result = 0;

            using (var db = new ModelAC())
            {
                #region db
                msg.App_Id = APP_GUID;

                msg.MsgClientId = model.MsgClientId;
                msg.From_UserId = user.Id;
                msg.To_GroupId  =
                    db.IM_Group.SingleOrDefault(p => p.App_Id == APP_GUID && p.GroupId == model.To_GroupId).Id;

                msg.MsgTime    = DateTime.Now;
                msg.IsFullRead = false;
                msg.MsgType    = model.MsgType;
                msg.MsgBody    = model.MsgBody;

                db.IM_MsgGroup.Add(msg);
                db_result = db.SaveChanges();
                #endregion
            }

            var session_result = Group_updateSession(msg);

            if (db_result == 1)
            {
                var mOGroup_SendText = new OGroup_SendText()
                {
                    #region 输出
                    Id          = msg.Id.ToString(),
                    MsgClientId = msg.MsgClientId,
                    From_UserId = model.From_UserId,
                    //From_UserImg = SITE_URL + user.PortraitUri,
                    To_GroupId = model.To_GroupId,
                    MsgTime    = msg.MsgTime,
                    IsFullRead = msg.IsFullRead,
                    MsgType    = msg.MsgType,
                    MsgBody    = msg.MsgBody,
                    #endregion
                };
                var jsonResult = CommonJson.camelObject(mOGroup_SendText);

                #region 消息分发

                Clients.OthersInGroup(msg.To_GroupId.ToString()).Group_SendPicture(jsonResult);
                #endregion

                return(jsonResult);
            }
            else
            {
                return(null);
            }
        }
        /// <summary>
        /// 会话-重置未读消息数
        /// </summary>
        /// <returns></returns>
        public object Chatter_ResetUnreadMsg(IChatter_ResetUnreadMsg model)
        {
            var             user         = LOGIN_USER;
            IM_ChatterActor chatterActor = null;
            var             db_result    = 0;

            using (var db = new ModelAC())
            {
                if (model.SessionType == IM_ChatType.Single)
                {
                    var userB = db.IM_User.SingleOrDefault(p => p.App_Id == APP_GUID && p.UserId == model.ChatId);
                    chatterActor = db.IM_ChatterActor
                                   .SingleOrDefault(p => p.App_Id == APP_GUID && p.IM_Chatter.ChatType == IM_ChatType.Single && p.UserId == user.Id &&
                                                    ((p.IM_Chatter.Single_A_UserId == user.Id && p.IM_Chatter.Single_B_UserId == userB.Id) ||
                                                     (p.IM_Chatter.Single_A_UserId == userB.Id && p.IM_Chatter.Single_B_UserId == user.Id)));

                    chatterActor.UnreadMsgCount = 0;
                    db_result = db.SaveChanges();
                }
                else if (model.SessionType == IM_ChatType.Group)
                {
                    var group = db.IM_Group.SingleOrDefault(p => p.App_Id == APP_GUID && p.GroupId == model.ChatId);
                    chatterActor = db.IM_ChatterActor
                                   .SingleOrDefault(p => p.App_Id == APP_GUID && p.IM_Chatter.ChatType == IM_ChatType.Group && p.UserId == user.Id && p.IM_Chatter.Group_GroupId == group.Id);

                    chatterActor.UnreadMsgCount = 0;
                    db_result = db.SaveChanges();
                }
            }
            if (db_result == 1)
            {
                var jsonResult = CommonJson.camelObject(new OChatter_ResetUnreadMsg
                {
                    ChatId         = model.ChatId,
                    SessionId      = chatterActor.ChatterId.ToString(),
                    SessionType    = model.SessionType,
                    UnreadMsgCount = chatterActor.UnreadMsgCount
                });
                return(jsonResult);
            }
            else
            {
                return(null);
            }
        }
        /// <summary>
        /// 群主-创建群
        /// </summary>
        public object GM_Create(IGM_Create model)
        {
            var mOGM_Create = new OGM_Create();

            if (ImGroupExists(model.GroupId))
            {
                mOGM_Create.Success = false;
                mOGM_Create.Msg     = "已存在该群组编号";

                return(CommonJson.camelObject(mOGM_Create));
            }

            var user          = LOGIN_USER;
            var group         = new IM_Group();
            var mIm_UserGroup = new Im_UserGroup();
            var db_result     = 0;

            using (var db = new ModelAC())
            {
                #region db
                group.App_Id    = APP_GUID;
                group.GroupId   = model.GroupId;
                group.GroupName = model.GroupName;

                mIm_UserGroup.IM_User_Id    = user.Id;
                mIm_UserGroup.IM_Group_Id   = group.Id;
                mIm_UserGroup.GroupPosition = IM_GroupPosition.Founder;

                db.IM_Group.Add(group);
                db.Im_UserGroup.Add(mIm_UserGroup);
                db_result = db.SaveChanges();
                #endregion
            }

            if (db_result > 0)
            {
                mOGM_Create.Success = true;
                mOGM_Create.Msg     = "群聊创建成功!";

                //将连接添加到指定的组
                Groups.Add(Context.ConnectionId, group.Id.ToString());
                return(CommonJson.camelObject(mOGM_Create));
            }
            else
            {
                mOGM_Create.Success = false;
                mOGM_Create.Msg     = "服务器错误!";

                return(CommonJson.camelObject(mOGM_Create));
            }
        }
        /// <summary>
        /// 发送-图片消息
        /// </summary>
        /// <returns></returns>
        public object Single_SendPicture(ISingle_SendText model)
        {
            var msg       = new IM_MsgSingle();
            var db_result = 0;

            using (var db = new ModelAC())
            {
                #region db
                msg.App_Id = APP_GUID;

                msg.MsgClientId = model.MsgClientId;
                msg.From_UserId =
                    db.IM_User.SingleOrDefault(p => p.App_Id == APP_GUID && p.UserId == model.From_UserId).Id;
                msg.To_UserId =
                    db.IM_User.SingleOrDefault(p => p.App_Id == APP_GUID && p.UserId == model.To_UserId).Id;

                msg.MsgTime = DateTime.Now;
                msg.IsRead  = false;
                msg.MsgType = model.MsgType;
                msg.MsgBody = model.MsgBody;

                db.IM_MsgSingle.Add(msg);
                db_result = db.SaveChanges();
                #endregion
            }

            var session_result = Single_updateSession(msg);

            if (db_result == 1)
            {
                var mOSingle_SendText = new OSingle_SendText()
                {
                    #region 输出
                    Id          = msg.Id.ToString(),
                    MsgClientId = msg.MsgClientId,
                    From_UserId = model.From_UserId,
                    To_UserId   = model.To_UserId,
                    MsgTime     = msg.MsgTime,
                    IsRead      = msg.IsRead,
                    MsgType     = msg.MsgType,
                    MsgBody     = msg.MsgBody,
                    #endregion
                };
                var jsonResult = CommonJson.camelObject(mOSingle_SendText);

                #region 消息分发
                string to__Account = HubKey.App__Account(app: APP, account: model.To_UserId);
                using (var db = new SignalR_MapUsersModel())
                {
                    var connections = db.Connections.Where(p => p.User_UserName == to__Account && p.Connected == true).ToList();
                    for (int i = 0; i < connections.Count(); i++)
                    {
                        Clients.Client(connections[i].ConnectionID).Single_SendPicture(jsonResult);
                    }
                }
                #endregion

                return(jsonResult);
            }
            else
            {
                return(null);
            }
        }
        /// <summary>
        /// 更新会话
        /// 单聊
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        private bool Single_updateSession(IM_MsgSingle msg)
        {
            var user      = LOGIN_USER;
            var db_result = 0;

            using (var db = new ModelAC())
            {
                var session = db.IM_Chatter.SingleOrDefault(p => p.App_Id == APP_GUID && p.ChatType == IM_ChatType.Single &&
                                                            ((p.Single_A_UserId == msg.From_UserId && p.Single_B_UserId == msg.To_UserId) ||
                                                             (p.Single_A_UserId == msg.To_UserId && p.Single_B_UserId == msg.From_UserId))
                                                            );
                if (session == null)
                {
                    #region 新增会话
                    var newSession = new IM_Chatter()
                    {
                        App_Id          = APP_GUID,
                        ChatType        = IM_ChatType.Single,
                        Single_A_UserId = msg.From_UserId,
                        Single_B_UserId = msg.To_UserId,
                        Group_GroupId   = null,
                    };

                    newSession.IM_ChatterActors.Add(new IM_ChatterActor()
                    {//消息发送者
                        App_Id         = APP_GUID,
                        ChatterId      = newSession.Id,
                        UserId         = msg.From_UserId,
                        Last_MsgId     = msg.Id,
                        UnreadMsgCount = 0,
                        ChatterTime    = DateTime.Now,
                        IsCleared      = false,
                    });

                    newSession.IM_ChatterActors.Add(new IM_ChatterActor()
                    {//消息接收者
                        App_Id         = APP_GUID,
                        ChatterId      = newSession.Id,
                        UserId         = msg.To_UserId,
                        Last_MsgId     = msg.Id,
                        UnreadMsgCount = 1,
                        ChatterTime    = DateTime.Now,
                        IsCleared      = false,
                    });

                    db.IM_Chatter.Add(newSession);
                    db_result = db.SaveChanges();
                    #endregion
                }
                else
                {
                    #region 更新会话
                    foreach (var toActor in session.IM_ChatterActors)
                    {
                        toActor.Last_MsgId = msg.Id;
                        if (toActor.UserId != user.Id)
                        {//消息接收者
                            toActor.UnreadMsgCount += 1;
                        }
                        toActor.ChatterTime = DateTime.Now;
                    }
                    db_result = db.SaveChanges();
                    #endregion
                }
            }

            return(db_result > 0);
        }
        /// <summary>
        /// 更新会话
        /// 群聊
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        private bool Group_updateSession(IM_MsgGroup msg)
        {
            var user = LOGIN_USER;
            //所有群聊成员
            var allMembers = new List <Guid>();
            var db_result  = 0;

            using (var db = new ModelAC())
            {
                allMembers = db.Im_UserGroup.Where(p => p.IM_Group_Id == msg.To_GroupId).Select(p => p.IM_User_Id).ToList();

                var session = db.IM_Chatter.SingleOrDefault(p =>
                                                            p.App_Id == APP_GUID && p.ChatType == IM_ChatType.Group && p.Group_GroupId == msg.To_GroupId);

                if (session == null)
                {
                    #region 新增会话
                    var newSession = new IM_Chatter()
                    {
                        App_Id          = APP_GUID,
                        ChatType        = IM_ChatType.Group,
                        Single_A_UserId = null,
                        Single_B_UserId = null,
                        Group_GroupId   = msg.To_GroupId,
                    };

                    newSession.IM_ChatterActors.Add(new IM_ChatterActor()
                    {//消息发送者
                        App_Id         = APP_GUID,
                        ChatterId      = newSession.Id,
                        UserId         = msg.From_UserId,
                        Last_MsgId     = msg.Id,
                        UnreadMsgCount = 0,
                        ChatterTime    = DateTime.Now,
                        IsCleared      = false,
                    });

                    allMembers.Remove(msg.From_UserId);
                    foreach (var memeberId in allMembers)
                    {//消息接收者
                        newSession.IM_ChatterActors.Add(new IM_ChatterActor()
                        {
                            App_Id         = APP_GUID,
                            ChatterId      = newSession.Id,
                            UserId         = memeberId,
                            Last_MsgId     = msg.Id,
                            UnreadMsgCount = 1,
                            ChatterTime    = DateTime.Now,
                            IsCleared      = false,
                        });
                    }

                    db.IM_Chatter.Add(newSession);
                    db_result = db.SaveChanges();
                    #endregion
                }
                else
                {
                    #region 更新会话
                    List <Guid> oldIM_ChatterActors = session.IM_ChatterActors.Select(p => p.UserId).ToList();
                    List <Guid> expectedList        = allMembers.Except(oldIM_ChatterActors).ToList();

                    foreach (var toActor in session.IM_ChatterActors)
                    {//更新会话参与者
                        toActor.Last_MsgId = msg.Id;
                        if (toActor.UserId != user.Id)
                        {//消息接收者
                            toActor.UnreadMsgCount += 1;
                        }
                        toActor.ChatterTime = DateTime.Now;
                    }

                    if (expectedList.Exists(p => p == msg.From_UserId))
                    {//新增会话参与者-消息发送者
                        expectedList.Remove(msg.From_UserId);

                        session.IM_ChatterActors.Add(new IM_ChatterActor()
                        {
                            App_Id         = APP_GUID,
                            ChatterId      = session.Id,
                            UserId         = msg.From_UserId,
                            Last_MsgId     = msg.Id,
                            UnreadMsgCount = 0,
                            ChatterTime    = DateTime.Now,
                            IsCleared      = false,
                        });
                    }

                    foreach (var memeberId in expectedList)
                    {//新增会话参与者-消息接收者
                        session.IM_ChatterActors.Add(new IM_ChatterActor()
                        {
                            App_Id         = APP_GUID,
                            ChatterId      = session.Id,
                            UserId         = memeberId,
                            Last_MsgId     = msg.Id,
                            UnreadMsgCount = 1,
                            ChatterTime    = DateTime.Now,
                            IsCleared      = false,
                        });
                    }

                    db_result = db.SaveChanges();
                    #endregion
                }
            }

            return(db_result > 0);
        }