From 69baadd312bced5da8f919e7ca488feb4aab689e Mon Sep 17 00:00:00 2001 From: TianMaiCheng <746290578@qq.com> Date: Thu, 8 Jan 2026 08:38:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20ETV=E8=AF=AD=E9=9F=B3?= =?UTF-8?q?=E7=94=B5=E8=A7=86=E7=9A=84=E6=94=AF=E6=8C=81=E3=80=82=E5=8F=A6?= =?UTF-8?q?=E5=A4=96=E4=BF=AE=E6=94=B9=E4=B8=80=E4=BA=9BBUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CRICS_V3_1124.suo | Bin 12780544 -> 12780544 bytes CommonEntity/CacheKey.cs | 1 + Dao/ISysHotelRepository.cs | 2 + Dao/Implement/SysHotelRepository.cs | 6 + Domain/SysHotel.cs | 1 + Domain/SysHotel.hbm.xml | 1 + RCUHost/Implement/HostServer.cs | 11 +- Service/ISysHotelManager.cs | 1 + Service/Implement/HostManager.cs | 24 +- Service/Implement/SysHotelManager.cs | 6 + WebSite/Controllers/IoTController.cs | 440 +++++++++++++++++++- WebSite/Controllers/SysHotelController.cs | 2 + WebSite/Global.asax.cs | 3 +- WebSite/Views/SysHotel/EditDockingInfo.ascx | 12 + 14 files changed, 497 insertions(+), 13 deletions(-) diff --git a/CRICS_V3_1124.suo b/CRICS_V3_1124.suo index db114a0c42bbf75cc02bfd5f01664586c88c01f1..fd26002953866d984421fcf16615bbf148a1239b 100644 GIT binary patch delta 62522 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

_jf`)@lY0m-W8QQIdxl)!5HQ+pGBCpb|YsPW>V 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⪙4$C7ojfsW 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�nJRknW0+~(3NTfai&SGInI$gjErRp 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 diff --git a/CommonEntity/CacheKey.cs b/CommonEntity/CacheKey.cs index ba3bfee..7fb01f8 100644 --- a/CommonEntity/CacheKey.cs +++ b/CommonEntity/CacheKey.cs @@ -85,6 +85,7 @@ namespace CommonEntity /// public static string XiaoDuYuYin = "XiaoDuYuYin"; public static string TCLYuYin = "TCLYuYin"; + public static string ETV_YuYin = "ETV_YuYin"; public static string PublicKeyboard = "PublicKeyboard"; diff --git a/Dao/ISysHotelRepository.cs b/Dao/ISysHotelRepository.cs index 49eb799..e29ff13 100644 --- a/Dao/ISysHotelRepository.cs +++ b/Dao/ISysHotelRepository.cs @@ -17,6 +17,8 @@ namespace Dao SysHotel GetByDomainUrl(string domainUrl); + SysHotel GetByETV_HotelId(string hotelid); + IList GetByGroup(SysHotelGroup group); List GetNeedData(); diff --git a/Dao/Implement/SysHotelRepository.cs b/Dao/Implement/SysHotelRepository.cs index fe4866e..a568922 100644 --- a/Dao/Implement/SysHotelRepository.cs +++ b/Dao/Implement/SysHotelRepository.cs @@ -201,5 +201,11 @@ namespace Dao.Implement return list; } } + + + public SysHotel GetByETV_HotelId(string hotelid) + { + return LoadAll().Where(r => r.ETV_HotelID.Equals(hotelid) && r.IsDeleted != true).OrderBy(r => r.Sort).FirstOrDefault(); + } } } diff --git a/Domain/SysHotel.cs b/Domain/SysHotel.cs index 153157f..3cebbf4 100644 --- a/Domain/SysHotel.cs +++ b/Domain/SysHotel.cs @@ -439,5 +439,6 @@ namespace Domain ///// ///// //public virtual string TCLAppSecret { get; set; } + public virtual string ETV_HotelID { get; set; } } } diff --git a/Domain/SysHotel.hbm.xml b/Domain/SysHotel.hbm.xml index 8c4f94a..8cacd5b 100644 --- a/Domain/SysHotel.hbm.xml +++ b/Domain/SysHotel.hbm.xml @@ -73,6 +73,7 @@ + diff --git a/RCUHost/Implement/HostServer.cs b/RCUHost/Implement/HostServer.cs index d14d71f..46e61cf 100644 --- a/RCUHost/Implement/HostServer.cs +++ b/RCUHost/Implement/HostServer.cs @@ -188,7 +188,7 @@ namespace RCUHost.Implement { logger.Error("Host Server启动失败,端口:3339"); Close(); - throw ex;//不能去掉,否则重启iis服务,通讯服务不会再次启动 + //throw ex;//不能去掉,否则重启iis服务,通讯服务不会再次启动 } } ///

@@ -1517,10 +1517,13 @@ namespace RCUHost.Implement byte cmdTypeTTT = context.SystemHeader.Value.CmdType; if (cmdTypeTTT == 0x36) { - IReceiver receiver = receivers[(CommandType)0x36]; - if (receiver != null) + if (receivers.ContainsKey((CommandType)0x36)) { - (receiver as GenericReceiverBase).Process(context);//处理业务逻辑 + IReceiver receiver = receivers[((CommandType)0x36)]; + if (receiver != null) + { + (receiver as GenericReceiverBase).Process(context);//处理业务逻辑 + } } } else diff --git a/Service/ISysHotelManager.cs b/Service/ISysHotelManager.cs index 1a8de8d..fb2b8a6 100644 --- a/Service/ISysHotelManager.cs +++ b/Service/ISysHotelManager.cs @@ -19,6 +19,7 @@ namespace Service SysHotel GetByAssociatedAccount(string associatedAccount); SysHotel GetByDomainUrl(string domainUrl); + SysHotel GetByETV_HotelId(string ETVHotelID); void UpdateDayTime(SysHotel entity); diff --git a/Service/Implement/HostManager.cs b/Service/Implement/HostManager.cs index 717f888..4112966 100644 --- a/Service/Implement/HostManager.cs +++ b/Service/Implement/HostManager.cs @@ -791,6 +791,16 @@ namespace Service.Implement { if (prop.Name == "Month" + DateTime.Now.Month.ToString() && Convert.ToInt16(prop.GetValue(hotelSeason, null)) == item.Season)//当前月份所属该季节,则发送命令给rcu设置空调 { + //System.Threading.Thread.Sleep(item.DelayTime * 1000);//延迟执行 + //foreach (HostModal hostModal in hostModals) + //{ + // //host 只需要hostnumber和mac + // //hostmodal只需要 address //和type + // //device.Address = hostModal.Modal.ModalAddress; + // //device.Type = hostModal.Modal.Type; + // HostModalManager.SetDevice(host, hostModal, item.Status, 0, item.SettingTemp, item.FanSpeed, item.Mode, 0);//0表示不变 + //} + var TTT = new Tuple>(host, item, hostModals); Task.Factory.StartNew((state) => { @@ -810,8 +820,8 @@ namespace Service.Implement HostModalManager.SetDevice(QQ0, hostModal, QQ1.Status, 0, QQ1.SettingTemp, QQ1.FanSpeed, QQ1.Mode, 0);//0表示不变 } }, TTT); - try - { + //try + //{ //这段代码在生产环境中不管用,很奇怪 //string KeyMission = System.Guid.NewGuid().ToString("N"); @@ -835,12 +845,12 @@ namespace Service.Implement //CSRedisCacheHelper.Set_Partition(MKey, m, 1); //DelayExe_Task(host, item.DelayTime, KeyMission); - break; - } - catch (Exception) - { + // break; + //} + //catch (Exception) + //{ - } + //} } } } diff --git a/Service/Implement/SysHotelManager.cs b/Service/Implement/SysHotelManager.cs index 4a8b459..e91e5d0 100644 --- a/Service/Implement/SysHotelManager.cs +++ b/Service/Implement/SysHotelManager.cs @@ -162,5 +162,11 @@ namespace Service.Implement { return ((ISysHotelRepository)(this.CurrentRepository)).LoadAll().Where(A=>!A.IsDeleted&&A.FCSPushEnable).ToList(); } + + + public SysHotel GetByETV_HotelId(string hotelid) + { + return ((ISysHotelRepository)(this.CurrentRepository)).GetByETV_HotelId(hotelid); + } } } diff --git a/WebSite/Controllers/IoTController.cs b/WebSite/Controllers/IoTController.cs index 16b09e8..3645f9d 100644 --- a/WebSite/Controllers/IoTController.cs +++ b/WebSite/Controllers/IoTController.cs @@ -6751,7 +6751,7 @@ namespace WebSite.Controllers else { hostModal = HostModalManager.GetByModalAddress(host.ID, modalAddress);//设备控制 - HttpContext.Cache.Insert(MKey,hostModal,null,DateTime.Now.AddMinutes(30),Cache.NoSlidingExpiration); + HttpContext.Cache.Insert(MKey, hostModal, null, DateTime.Now.AddMinutes(30), Cache.NoSlidingExpiration); } if (hostModal == null) { @@ -7177,6 +7177,444 @@ namespace WebSite.Controllers // return Json(ex.Message, JsonRequestBehavior.AllowGet); // } //} + + + /// + /// ETV-艺龙酒店(绥化北林店)728893 + /// 授权接口 + /// + /// + [HttpPost()] + public ActionResult ETV_Auth() + { + Request.InputStream.Position = 0; + byte[] reqBody = new byte[Request.InputStream.Length]; + Request.InputStream.Read(reqBody, 0, reqBody.Length); + string reqData = System.Text.Encoding.UTF8.GetString(reqBody); + var ttt = JsonConvert.DeserializeObject(reqData); + + //clientId: a6f3270f77b545a087daa1caed816b3b + //clientSecret:8854e0b8261b49d6989b5b2f39bd157a + if (ttt.clientId.Equals("a6f3270f77b545a087daa1caed816b3b") && ttt.clientSecret.Equals("8854e0b8261b49d6989b5b2f39bd157a")) + { + var token = Guid.NewGuid().ToString("N"); + string kkk = "ETVKey"; + CSRedisCacheHelper.Set_PartitionWithTime(kkk, token, 7 * 24 * 60, 5); + + TV_ResponseData c = new TV_ResponseData(); + c.code = 200; + c.msg = null; + c.data = new TTT_Data() + { + token = token, + expiresIn = 7 * 24 * 60 * 60 + }; + //{ + // "code": 200, + // "msg": null, + // "data": { + // "token": "74b87337454200d4d33f80c4663dc5e5", + // "expiresIn": 154589 + // } + //} + + return Json(c, JsonRequestBehavior.AllowGet); + } + else + { + + TV_ResponseData c = new TV_ResponseData(); + c.code = 500; + c.msg = "鉴权数据错误"; + c.data = null; + return Json(c, JsonRequestBehavior.AllowGet); + } + } + /// + /// 两天时间要对接完,时间紧迫,数据先写死 + /// + public static Dictionary ETVDic = new Dictionary() + { + //艺龙酒店(绥化北林万达广场店) + {"1668326697184","1213"} + }; + + [HttpPost()] + public ActionResult ETV_Controller() + { + try + { + string IP = ""; + string PPP = Request.UserHostAddress; + string III = Request.ServerVariables["REMOTE_ADDR"]; + if (string.IsNullOrEmpty(III)) + { + IP = PPP; + } + else + { + IP = III; + } + var token = Request.Headers["Authorization"]; + string kkk = "ETVKey"; + var t_take = CSRedisCacheHelper.Get_Partition(kkk, 5); + //t_take = "abc"; + if (t_take == null || !t_take.Equals(token)) + { + return Json(new { code = 500, msg = "token已经过期" }, JsonRequestBehavior.AllowGet); + } + Request.InputStream.Position = 0; + byte[] reqBody = new byte[Request.InputStream.Length]; + Request.InputStream.Read(reqBody, 0, reqBody.Length); + string reqData = System.Text.Encoding.UTF8.GetString(reqBody); + + var ttt = JsonConvert.DeserializeObject(reqData); + + string hotelid_WANBU = ttt.hotelId; + + //var hotelid = ETVDic[hotelid_WANBU]; + string hotelid = ""; + int hotelid_int = 0; + //int.TryParse(hotelid, out hotelid_int); + + SysHotel hotel_sys = null; + string KKKHotel = "HotelInfoETV_" + hotelid_WANBU; + var hotel_ooo = HttpContext.Cache.Get(KKKHotel); + if (hotel_ooo != null) + { + hotel_sys = hotel_ooo as SysHotel; + } + else + { + hotel_sys = SysHotelManager.GetByETV_HotelId(hotelid_WANBU); + HttpContext.Cache.Insert(KKKHotel, hotel_sys, null, Cache.NoAbsoluteExpiration, new TimeSpan(0, 20, 0)); + } + if (hotel_sys != null) + { + hotelid_int = hotel_sys.ID; + hotelid = hotel_sys.ID.ToString(); + } + else + { + return Json(new { code = 500, msg = "找不到此酒店" }, JsonRequestBehavior.AllowGet);//"小度音箱(" + request.payload.cuid + ")尚未绑定客房主机" + } + + string msgid = Guid.NewGuid().ToString("N"); + string roomNo = ttt.roomNo; + string traceId = ttt.traceId; + string domain = ttt.domain; + string intent = ttt.intent; + List slots = ttt.slots; + + + bool is_monitor = true; + if (is_monitor) + { + IOTMonitorData i = new IOTMonitorData(); + i.RemoteIP = IP; + i.Step = 0; + string ti =DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.ffffff"); + i.CreateTime = DateTime.Now; + i.TriggerTime = ti; + i.HotelId = hotelid; + i.HotelCode = int.Parse(hotel_sys.Code); + i.RoomNumber = roomNo; + i.RequestId = msgid; + i.Platform = "ETV"; + i.CommandDescription = reqData; + SendMQTTData.Send(i); + } + Host host = null; + string ETVKongZhiKey = CacheKey.ETV_YuYin + "_" + hotelid + "_" + roomNo; + var UXV = HttpContext.Cache.Get(ETVKongZhiKey); + if (UXV != null) + { + host = UXV as Host; + } + else + { + // host = HostManager.GetByXiaoDuCUID(XiaoDuCUID);//根据小度音箱序列号获取对应RCU主机 + host = HostManager.GetByRoomNumber(roomNo, hotelid_int); + if (host != null) + { + string code = host.SysHotel.Code; + string roomno = host.RoomNumber; + HttpContext.Cache.Insert(ETVKongZhiKey, host, null, DateTime.Now.AddMinutes(20), Cache.NoSlidingExpiration); + } + } + + if (host == null) + { + return Json(new { code = 500, msg = "找不到此房间" }, JsonRequestBehavior.AllowGet);//"小度音箱(" + request.payload.cuid + ")尚未绑定客房主机" + } + + int hotelcode = 0; + int.TryParse(host.SysHotel.Code, out hotelcode); + + bool is_online = Common.CSRedisCacheHelper.Contains(host.HostNumber, host.MAC); + + if (true) + { + string sss = "酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")房间号:(" + host.RoomNumber + ") is_online: " + is_online.ToString(); + IOTMonitorData i = new IOTMonitorData(); + i.ControlClass = ControlClass_KongZhiSheBei; + i.Step = 1; + i.CreateTime = DateTime.Now; + string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff"); + i.TriggerTime = ti; + i.HotelId = hotelid; + i.HotelCode = int.Parse(host.SysHotel.Code); + i.RoomNumber = roomNo; + i.RequestId = msgid; + i.Platform = "ETV"; + i.CommandDescription = sss; + SendMQTTData.Send(i); + } + if (!is_online) + { + logger.Error("ETV当前访问酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")客房rcu(" + host.RoomNumber + ")不在线"); + return Json(new { code = 500, msg = "当前客户已经离线" }, JsonRequestBehavior.AllowGet); + } + + + bool is_take_card = CheckGetPower(host); + + if (true) + { + string sss = "酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")房间号:(" + host.RoomNumber + ") 取电: " + is_take_card.ToString(); + IOTMonitorData i = new IOTMonitorData(); + i.Step = 2; + i.CreateTime = DateTime.Now; + string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff"); + i.TriggerTime = ti; + i.HotelId = hotelid; + i.HotelCode = hotelcode; + i.RoomNumber = roomNo; + i.RequestId = msgid; + i.Platform = "ETV"; + i.CommandDescription = sss; + SendMQTTData.Send(i); + } + if (!is_take_card) + { + logger.Error("ETV当前访问酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")客房rcu(" + host.RoomNumber + ")尚未取电"); + return Json(new { code = 500, msg = "只有取电后才能控制" }, JsonRequestBehavior.AllowGet); + } + + IList hostModals = null; + + string Hkey = "ETVIOT_" + host.ID; + var dataH = HttpContext.Cache.Get(Hkey); + if (dataH != null) + { + hostModals = dataH as IList; + } + else + { + hostModals = HostModalManager.LoadByHostID(host.ID).Where(r => r.Modal.WXActiveIndicator).ToList(); + if (hostModals != null && hostModals.Count > 0) + { + HttpContext.Cache.Insert(Hkey, hostModals, null, DateTime.Now.AddMinutes(30), Cache.NoSlidingExpiration); + } + } + // hostmodal只需要 address 和type + // device.Address = hostModal.Modal.ModalAddress; + // device.Type = hostModal.Modal.Type + if (intent.Equals("IOT.Light") || intent.Equals("IOT.Switch") || intent.Equals("IOT.Curtain")) + { + foreach (var item in slots) + { + var action = item.action; + var name = item.applianceName; + List q1 = new List(); + if (name.Equals("灯")) + { + q1 = hostModals.Where(A => A.Modal.Name.Contains("灯")).ToList(); + } + else + { + q1 = hostModals.Where(A => A.Modal.Name.Equals(name)||A.Modal.AliasName.Equals(name)).ToList(); + } + if (q1 != null && q1.Count > 0) + { + foreach (var item_inter in q1) + { + int status = 0; + int brightness = 0; + if (action.Equals("TurnOnRequest")) + { + status = 1; + brightness = 100; + } + else if (action.Equals("TurnOffRequest")) + { + status = 2; + brightness = 0; + } + Thread.Sleep(50); + HostModalManager.SetDevice(host, item_inter, status, brightness); + } + } + } + } + if (intent.Equals("IOT.AirCondition")) + { + foreach (var item in slots) + { + var action = item.action; + var name = item.applianceName; + var value = item.value; + var q1 = hostModals.Where(A => A.Modal.Type == DeviceType.AirConditioner && A.Modal.Name.Equals(name)); + foreach (var item_inter in q1) + { + int status = 0; + int temperature = 25; + int fanSpeed = 0; + int mode = 0; + int dianci_famen = 0; + int brightness = 0; + if (action.Equals("TurnOnRequest")) + { + status = 1; + } + if (action.Equals("TurnOffRequest")) + { + status = 2; + } + if (action.Equals("setTemperature")) + { + int v = 25; + int.TryParse(value, out v); + temperature = v; + } + if (action.Equals("setFanSpeed")) + { + //value=high(高),middle(中),low(低),auto(自动) + //空调风速:自动0,低1,中2,高3 + if (value.Equals("high")) + { + fanSpeed = 3; + } + else if (value.Equals("middle")) + { + fanSpeed = 2; + } + else if (value.Equals("low")) + { + fanSpeed = 1; + } + else if (value.Equals("auto")) + { + fanSpeed = 0; + } + } + if (action.Equals("setMode")) + { + //value=cool(制冷),heat(制热),fan=(通风),auto(自动) + //自动0,制冷1,制热2,送风3 + if (value.Equals("cool")) + { + mode = 1; + } + else if (value.Equals("heat")) + { + mode = 2; + } + else if (value.Equals("fan")) + { + mode = 3; + } + else if (value.Equals("auto")) + { + mode = 0; + } + } + HostModalManager.SetDevice(host, item_inter, status, brightness, temperature, fanSpeed, mode); + } + if (q1 != null) + { + } + } + } + if (intent.Equals("IOT.SceneTrigger")) + { + + foreach (var item in slots) + { + var action = item.action; + var name = item.applianceName; + int hid = int.Parse(hotelid); + var scene = RoomTypeSceneManager.LoadAll().Where(A => A.HotelID == hid && A.Name.Equals(name)).FirstOrDefault(); + if (scene != null) + { + if (action.Equals("TurnOnRequest")) + { + LightControlManager.ApplyScene(host, scene); + } + if (action.Equals("TurnOffRequest")) + { + LightControlManager.ApplyScene(host, scene); + } + } + } + } + if (is_monitor) + { + IOTMonitorData i = new IOTMonitorData(); + i.Step = 4; + string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff"); + i.CreateTime = DateTime.Now; + i.TriggerTime = ti; + i.HotelId = hotelid; + i.HotelCode = hotelcode; + i.RoomNumber = roomNo; + i.RequestId = msgid; + i.Platform = "ETV"; + i.CommandDescription = "success"; + SendMQTTData.Send(i); + } + return Json(new { code = 200, msg = "控制成功" }, JsonRequestBehavior.AllowGet); + } + catch (Exception ex) + { + return Json(new { code = 500, msg = ex.Message }, JsonRequestBehavior.AllowGet); + } + } + } + public class ETV_ControllerData + { + public string hotelId { get; set; } + public string roomNo { get; set; } + public string traceId { get; set; } + public string domain { get; set; } + public string intent { get; set; } + public List slots { get; set; } + } + public class ETV_CanShu + { + public string applianceType { get; set; } + public string action { get; set; } + public string applianceName { get; set; } + public string value { get; set; } + } + public class TV_ResponseData + { + public int code { get; set; } + public object msg { get; set; } + public TTT_Data data { get; set; } + } + public class TTT_Data + { + public string token { get; set; } + /// + /// 时间为秒 + /// + public long expiresIn { get; set; } + } + public class TV_AuthData + { + public string clientId { get; set; } + public string clientSecret { get; set; } } public class HiWeiToken { diff --git a/WebSite/Controllers/SysHotelController.cs b/WebSite/Controllers/SysHotelController.cs index c54d6dd..4384b60 100644 --- a/WebSite/Controllers/SysHotelController.cs +++ b/WebSite/Controllers/SysHotelController.cs @@ -305,6 +305,7 @@ namespace WebSite.Controllers sysHotel.IsUseQianLiMa = entity.IsUseQianLiMa; sysHotel.IsPushPMSData = entity.IsPushPMSData; sysHotel.HeTongNumber = entity.HeTongNumber; + sysHotel.ETV_HotelID = entity.ETV_HotelID; //sysHotel.TCLAppId = entity.TCLAppId; //sysHotel.TCLAppSecret = entity.TCLAppSecret; SysHotelManager.Update(sysHotel); @@ -388,6 +389,7 @@ namespace WebSite.Controllers TakeOut.SysHotel.IsUseQianLiMa = entity.IsUseQianLiMa;//断电重置小度 TakeOut.SysHotel.IsPushPMSData = entity.IsPushPMSData; TakeOut.SysHotel.HeTongNumber = entity.HeTongNumber; + TakeOut.SysHotel.ETV_HotelID = entity.ETV_HotelID; //TakeOut.SysHotel.TCLAppId = entity.TCLAppId; //TakeOut.SysHotel.TCLAppSecret = entity.TCLAppSecret; diff --git a/WebSite/Global.asax.cs b/WebSite/Global.asax.cs index d961b9c..dadc4a7 100644 --- a/WebSite/Global.asax.cs +++ b/WebSite/Global.asax.cs @@ -474,7 +474,8 @@ namespace WebSite hostServer.AddReceiver(new RCUHost.Implement.UpgradeProgressBar()); hostServer.AddReceiver(new RCUHost.Implement.RoomStatusChangedReceiver()); hostServer.AddReceiver(new RCUHost.Implement.AskRoomStatusChangedReceiver()); - hostServer.AddReceiver((IReceiver)new RCUHost.Implement.New_RoomStatusReceiver()); + //hostServer.AddReceiver((IReceiver)new RCUHost.Implement.New_RoomStatusReceiver()); + hostServer.AddReceiver(new RCUHost.Implement.New_RoomStatusReceiver()); } /// diff --git a/WebSite/Views/SysHotel/EditDockingInfo.ascx b/WebSite/Views/SysHotel/EditDockingInfo.ascx index dd0dc8a..e7f86e6 100644 --- a/WebSite/Views/SysHotel/EditDockingInfo.ascx +++ b/WebSite/Views/SysHotel/EditDockingInfo.ascx @@ -319,6 +319,18 @@ value="true" <%: Model.IsUseTCLTV ? "checked='checked'" : "" %> /> + + + + + + + + + + +