Ejemplo n.º 1
0
 public void AddPlayerToRoom(Player p)
 {
     _Players.Add(p);
     if (_Players.Count >= MaxPlayer)
     {
         _RoomState = EnumRoomState.Full;
     }
 }
Ejemplo n.º 2
0
        /// <summary>
        /// 设置频道状态
        /// </summary>
        /// <param name="room"></param>
        /// <returns></returns>
        public bool UpdateChannelState(string ConversationRoomID, EnumRoomState roomState)
        {
            using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["KMEHospEntities"].ConnectionString))
            {
                SqlCommand cmd = new SqlCommand(@"update ConversationRooms set RoomState=@RoomState,ModifyTime=@ModifyTime 
                where ConversationRooms.ConversationRoomID=@ConversationRoomID");

                cmd.Parameters.Add("@ModifyTime", SqlDbType.DateTime).Value = DateTime.Now;
                //cmd.Parameters.Add("@TriageID", SqlDbType.BigInt).Value = room.TriageID;
                cmd.Parameters.Add("@RoomState", SqlDbType.Int).Value          = (int)roomState;
                cmd.Parameters.Add("@ConversationRoomID", SqlDbType.Int).Value = ConversationRoomID;

                var ret = cmd.ExecuteNonQuery() > 0;
                if (ret)
                {
                    var cacheKey = new StringCacheKey(StringCacheKeyType.Channel, ConversationRoomID);
                    cacheKey.RemoveCache();
                }

                return(ret);
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 比较并设置房间状态
        /// </summary>
        /// <param name="ChannelID"></param>
        /// <param name="FromUserID"></param>
        /// <param name="State"></param>
        /// <param name="DisableWebSdkInteroperability"></param>
        /// <param name="ExpectedState"> 返回值</param>
        /// <returns></returns>
        public EnumApiStatus CompareAndSetChannelState(string ConversationRoomID, string FromUserID, EnumRoomState State, bool DisableWebSdkInteroperability, ref EnumRoomState ExpectedState)
        {
            try
            {
                var room = GetChannelInfo(ConversationRoomID);

                #region 校验:房间已标记为失效的,不可设置房间状态
                if (room.Close)
                {
                    return(EnumApiStatus.BizChannelSetStateIfClose);
                }
                #endregion

                #region 校验:房间状态未启用
                if (!room.Enable)
                {
                    //频道未就绪(客户端重试)
                    return(EnumApiStatus.BizChannelNotReady);
                }
                #endregion

                #region 校验:当前房间状态和预期的房间状态一致才允许设置

                #region 处理特殊状态情况 客户端没有WaitAgain 状态需要统一
                if (ExpectedState == EnumRoomState.Waiting && room.RoomState == EnumRoomState.WaitAgain)
                {
                    ExpectedState = room.RoomState;
                }
                #endregion

                if (room.RoomState != ExpectedState)
                {
                    //返回新的状态给客户端,客户端需要同步
                    ExpectedState = room.RoomState;

                    //前端用户只需要知道有候诊状态即可,不需要知道有重复候诊的状态
                    if (ExpectedState == EnumRoomState.WaitAgain)
                    {
                        ExpectedState = EnumRoomState.Waiting;
                    }

                    //当前状态不是预期状态
                    return(EnumApiStatus.BizChannelRejectSetStateIfNotExpectedState);
                }
                #endregion

                #region 校验:只能在预约时间内进入诊室或提前30分钟进入诊室
                if ((State == EnumRoomState.WaitAgain || State == EnumRoomState.Waiting))
                {
                    if (DateTime.Now <= room.BeginTime.AddMinutes(-30))
                    {
                        return(EnumApiStatus.BizChannelRejectConnectIfNoReservationTime);
                    }
                }
                #endregion

                #region 校验:医生在休诊状态下不可进入诊室
                if ((State == EnumRoomState.WaitAgain || State == EnumRoomState.Waiting))
                {
                    if (IsChannelDiagnoseOff(room))
                    {
                        return(EnumApiStatus.BizChannelRejectConnectIfDiagnoseOff);
                    }
                }
                #endregion

                #region 房间状态切换的规则
                switch (room.RoomState)
                {
                case EnumRoomState.AlreadyVisit:
                {
                    //就诊已经结束不能在设置状态
                    return(EnumApiStatus.BizOK);
                }

                case EnumRoomState.NoTreatment:
                {
                    if (State == EnumRoomState.NoTreatment)
                    {
                        State = EnumRoomState.NoTreatment;
                    }
                    else if (State == EnumRoomState.InMedicalTreatment)
                    {
                        State = EnumRoomState.InMedicalTreatment;
                    }
                    else
                    {
                        State = EnumRoomState.Waiting;
                    }
                    break;
                }

                case EnumRoomState.Waiting:
                {
                    //重试
                    if (State == EnumRoomState.Waiting || State == EnumRoomState.WaitAgain)
                    {
                        State = EnumRoomState.Waiting;
                    }
                    //医生呼叫
                    else if (State == EnumRoomState.Calling)
                    {
                        State = EnumRoomState.Calling;
                    }
                    //接听
                    else if (State == EnumRoomState.InMedicalTreatment)
                    {
                        State = EnumRoomState.InMedicalTreatment;
                    }
                    //候诊界面,用户点击离开或者异常断开都是未就诊
                    else
                    {
                        State = EnumRoomState.NoTreatment;
                    }
                    break;
                }

                case EnumRoomState.Calling:
                {
                    //重试
                    if (State == EnumRoomState.Calling)
                    {
                        State = EnumRoomState.Calling;
                    }
                    //接听
                    else if (State == EnumRoomState.InMedicalTreatment)
                    {
                        State = EnumRoomState.InMedicalTreatment;
                    }
                    //取消呼叫 或者拒绝
                    else if (State == EnumRoomState.Waiting || State == EnumRoomState.WaitAgain)
                    {
                        State = EnumRoomState.WaitAgain;
                    }
                    else
                    {
                        State = EnumRoomState.Disconnection;
                    }
                    break;
                }

                case EnumRoomState.InMedicalTreatment:
                {
                    //重试
                    if (State == EnumRoomState.InMedicalTreatment)
                    {
                        State = EnumRoomState.InMedicalTreatment;
                    }
                    //医生挂断
                    else if (State == EnumRoomState.AlreadyVisit)
                    {
                        State = EnumRoomState.AlreadyVisit;
                    }
                    //重试候诊
                    else if (State == EnumRoomState.Waiting || State == EnumRoomState.WaitAgain)
                    {
                        State = EnumRoomState.WaitAgain;
                    }
                    //患者离开,一会再来
                    else
                    {
                        State = EnumRoomState.Disconnection;
                    }
                    break;
                }

                case EnumRoomState.Disconnection:
                {
                    //医生挂断
                    if (State == EnumRoomState.AlreadyVisit)
                    {
                        State = EnumRoomState.AlreadyVisit;
                    }
                    //取消呼叫 或者拒绝
                    else if (State == EnumRoomState.Waiting || State == EnumRoomState.WaitAgain)
                    {
                        State = EnumRoomState.WaitAgain;
                    }
                    else
                    {
                        State = EnumRoomState.Disconnection;
                    }
                    break;
                }

                case EnumRoomState.WaitAgain:
                {
                    //医生呼叫
                    if (State == EnumRoomState.Calling)
                    {
                        State = EnumRoomState.Calling;
                    }
                    //取消呼叫 或者拒绝
                    else if (State == EnumRoomState.Waiting || State == EnumRoomState.WaitAgain)
                    {
                        State = EnumRoomState.WaitAgain;
                    }
                    else
                    {
                        State = EnumRoomState.Disconnection;
                    }
                    break;
                }
                }
                #endregion

                //默认高版本,当前禁用互通性(SDK直接可以互通的情况下)
                if (room.DisableWebSdkInteroperability)
                {
                    room.DisableWebSdkInteroperability = DisableWebSdkInteroperability;
                }

                room.RoomState = State;

                #region 推送状态变更消息,并修改状态
                using (MQChannel mqChannel = new MQChannel())
                {
                    mqChannel.BeginTransaction();
                    if (!mqChannel.Publish(new ChannelStateChangedEvent()
                    {
                        ChannelID = ConversationRoomID,
                        FromUserID = FromUserID,
                        State = State,
                        ExpectedState = ExpectedState,
                        DisableWebSdkInteroperability = room.DisableWebSdkInteroperability
                    }))
                    {
                        return(EnumApiStatus.BizError);
                    }

                    if (conversationRoomRepository.UpdateChannelState(room.ConversationRoomID, room.RoomState))
                    {
                        mqChannel.Commit();
                        return(EnumApiStatus.BizOK);
                    }
                    else
                    {
                        return(EnumApiStatus.BizError);
                    }
                }
                #endregion
            }
            catch (Exception ex)
            {
                LogHelper.DefaultLogger.Error(ex.Message, ex);
                //业务错误
                return(EnumApiStatus.BizError);
            }
        }
Ejemplo n.º 4
0
 public Room()
 {
     _RoomState = EnumRoomState.Avaible;
     _Players   = new List <Player>();
 }