public void AddPlayerToRoom(Player p) { _Players.Add(p); if (_Players.Count >= MaxPlayer) { _RoomState = EnumRoomState.Full; } }
/// <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); } }
/// <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); } }
public Room() { _RoomState = EnumRoomState.Avaible; _Players = new List <Player>(); }