using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading; using System.Threading.Tasks; using Common; using Dao; using Domain; using RCUHost.Protocols; using System.Collections; using CommonEntity; using RestSharp; using Newtonsoft.Json.Linq; using System.Configuration; using Microsoft.IO; namespace RCUHost.Implement { public class RoomStatusReceiver : GenericReceiverBase, IRoomStatusReceiver { //private static readonly RecyclableMemoryStreamManager manager = new RecyclableMemoryStreamManager(); private static log4net.ILog logger = log4net.LogManager.GetLogger(typeof(RoomStatusReceiver)); //private ConcurrentDictionary roomsStatus = new ConcurrentDictionary(); public IHostRepository HostRepository { get; set; } public IHostModalRepository HostModalRepository { get; set; } public IHostModalRecordRepository HostModalRecordRepository { get; set; } public IHostFaultsRepository HostFaultsRepository { get; set; } public IHostFaultRecordsRepository HostFaultRecordsRepository { get; set; } public IHostSceneRepository HostSceneRepository { get; set; } public IRoomTypeSceneRepository RoomTypeSceneRepository { get; set; } public ISysOauth2Repository SysOauth2Repository { get; set; } public IRoomCardRepository RoomCardRepository { get; set; } public IRoomCardTypeRepository RoomCardTypeRepository { get; set; } public IHotelSeasonRepository HotelSeasonRepository { get; set; } public IHotelAirControlRepository HotelAirControlRepository { get; set; } public IDeviceControlReceiver DeviceControlReceiver { get; set; } //阿宝添加的 public ICarbonScene_SetRepository CarbonScene_SetRepository { get; set; } public ILieECORepository ILieECORepository { get; set; } public static string PoolOverFlowKey = "PoolOverFlowKey"; public static string TakeCardReportFlowKey = "TakeCardReportFlowKey"; //StringBuilder sb = new StringBuilder(); public override void Process(ReceiverContext context) { StepTongJi.SendInfo(4, "Task内部开始执行", context.MessageID, context.IsMonitor); string HostNumberOnly = context.SystemHeader.Value.HostNumber.ToString(); string hotelcode = context.SystemHeader.Value.HostNumber.ToHotelCode().ToString(); #region 如果超过2秒就不再处理了 //string ShiJianLanJie = CacheKey.SyncTimeIntercept + "_" + HostNumberOnly; //object VVV = MemoryCacheHelper.Get(ShiJianLanJie); //if (VVV == null) //{ // string hotelCode = context.SystemHeader.Value.HostNumber.ToHotelCode().ToString();//获取酒店编码 // string RegisterKey1 = "RoomStatusTimeOutDrop"; // RCUHost.RCUHostCommon.tools.LanJieData(RegisterKey1, hotelCode); // return; //} //回复 //Reply(context); #endregion Host host = null; string Key = CacheKey.HostInfo_Key_HostNumber + "_" + HostNumberOnly; string Key_Same1 = CacheKey.RoomStatus_Prefix + "_" + HostNumberOnly; object obj = MemoryCacheHelper.Get(Key); if (obj != null) { host = obj as Host; } else { Host host_O = HostRepository.GetByHostNumber(HostNumberOnly); MemoryCacheHelper.SlideSet(Key, host_O); MemoryCacheHelper.SlideSet(Key_Same1, host_O); host = host_O; } if (host != null) { if (host.SysHotel.IsNewVersionProtocol) { NewVersionHexData ns = new NewVersionHexData(); ns.CmdType = 0x01; ns.HotelCode = hotelcode; ns.HostNumber = HostNumberOnly; ns.RemoteEndPoint = context.RemoteEndPoint.ToString(); ns.CurrentTime = DateTime.Now; ns.HexData = Tools.ByteToString(context.Data); CSRedisCacheHelper.Publish("redis-rcu-registerdata", Newtonsoft.Json.JsonConvert.SerializeObject(ns)); } } string k1 = CacheKey.HostFrameNo + "_" + HostNumberOnly; string k2 = CacheKey.PowerSupply + "_" + HostNumberOnly; string k3 = CacheKey.LockVoltage + "_" + HostNumberOnly; string k4 = CacheKey.HostTemp + "_" + HostNumberOnly; ushort fff = CSRedisCacheHelper.ForeverGet(k1); if (host == null) { return; } if (context.SystemHeader.Value.FrameNo != 65535 && context.SystemHeader.Value.FrameNo == fff) { //return; } try { int offset = StructConverter.SizeOf(context.SystemHeader); int length = context.Data.Length - offset - 2; //using (var stream = manager.GetStream()) //{ //stream.Write(context.Data, offset, length); //} using (MemoryStream stream = new MemoryStream(context.Data, offset, length)) { bool isTriggerWelcomeMsg = true; Status status = DecodeRoomStatus_NEW(stream, HostNumberOnly, out isTriggerWelcomeMsg, host.SysHotel.Code, host.RoomNumber); if (status != null) { #region 放进缓存来处理 //host.FrameNo = context.SystemHeader.Value.FrameNo; //host.PowerSupply = !status.SysLock;//电源锁定(0正常,1锁定)//host.RoomCard.ID = status.CardType;//房卡:已修改到房卡上报协议 //host.LockVoltage = status.ElecQty;//门锁电量 //host.HostTemp = status.HostTemp;//主机温度 //HostRepository.SetHostInfo(host); #endregion CSRedisCacheHelper.Forever(k1, context.SystemHeader.Value.FrameNo); CSRedisCacheHelper.Forever(k2, !status.SysLock); CSRedisCacheHelper.Forever(k3, status.ElecQty); CSRedisCacheHelper.Forever(k4, status.HostTemp); StepTongJi.SendInfo(4.1, "设置Host库信息", context.MessageID, context.IsMonitor); if (status.Devices != null && status.Devices.Count > 0) { var LLL = status.Devices.OrderBy(A => A.Key); var KKK1 = LLL.Select(A => A.Key); var KKK2 = LLL.Select(A => A.Value.StatusReceiver.ToString("00")); var VVV1 = string.Join("", KKK1); var VVV2 = string.Join("", KKK2); //sb.Clear(); //sb.Append(VVV1); //sb.Append(VVV2); //string nnn = sb.ToString(); //来一个数据,把所有的地址拼接起来 string YiJingChuLiGuo = CacheKey.AllReadyDealWith0E_Prefix + "_" + HostNumberOnly; MemoryCacheHelper.Delete(YiJingChuLiGuo); ProcessModal_NEW_NEW(host, status.Devices, isTriggerWelcomeMsg, context.MessageID, context.IsMonitor);//更新灯光及其他回路状态 string nnn = VVV1 + VVV2; if (!string.IsNullOrEmpty(nnn)) { MemoryCacheHelper.Set(YiJingChuLiGuo, nnn, DateTimeOffset.Now.AddMinutes(30)); } } if (status.Faults != null && status.Faults.Count > 0) { ProcessFaults(host, status.Faults);//处理故障 } } } } catch (Exception ex) { logger.Error(string.Format("更新酒店({0})客房({1})状态数据出错。", host.SysHotel.ID, host.RoomNumber), ex); } } public static string welKey = "redis-triggerwelcome_change"; public SomeDeviceExistsData HostDataTake(ReceiverContext context) { string HostNumberOnly = context.SystemHeader.Value.HostNumber.ToString(); string Key = CacheKey.RoomStatus_Prefix + "_" + HostNumberOnly; SomeDeviceExistsData host = CSRedisCacheHelper.Get_Partition(Key); if (host != null) { } else { Host host_O = HostRepository.GetByHostNumber(HostNumberOnly); SomeDeviceExistsData h = new SomeDeviceExistsData(); h.IP = host_O.IP; h.MAC = host_O.MAC; h.HostNUMBER = HostNumberOnly; h.HostID = host_O.ID; h.HotelCode = host_O.SysHotel.Code; h.HotelID = host_O.SysHotel.ID; h.RoomTypeID = host_O.RoomType.ID; h.RoomNumber = host_O.RoomNumber; h.FrameNo = host_O.FrameNo; h.DeviceStatusPushURL = host_O.SysHotel.DeviceStatusPushURL; h.FaultPushURL = host_O.SysHotel.FaultPushURL; h.XiaoDuCUID = host_O.XiaoDuCUID; h.TianMaoCUID = host_O.TianMaoCUID; h.WelcomeSpeech = host_O.SysHotel.WelcomeSpeech; h.GoodbyeSpeech = host_O.SysHotel.GoodbyeSpeech; h.RoomCardData = host_O.RoomCard; h.RoomStatus = host_O.RoomStatus; CSRedisCacheHelper.Set_Partition(Key, h); host = h; } return host; } public static string Missionsys_Address = ConfigurationManager.AppSettings["missionsys_address"]; public static string MQTTInfo_report_url = ConfigurationManager.AppSettings["debug_log_report_url"].ToString(); private void ProcessModal_NEW_NEW(Host host, ConcurrentDictionary devices, bool IsTriggerWelcomeMsg, string ContextMessageId, bool ismonitor) { string UUID = "9dc6a0ee-dcf1-4385-b05f-09cb463838cd"; UUID = host.FCS_locationUUID; string PropertyUUID = host.SysHotel.FCS_PropertyID; string FCS_RCU_Device_Offline = host.SysHotel.FCS_RCU_Device_Offline; string FCSLoginUrl = host.SysHotel.FCSLoginUrl; string FCSLoginUserName = host.SysHotel.FCSLoginUserName; string FCSLoginPassWord = host.SysHotel.FCSLoginPassWord; string FCS_Carbon_UUID = host.SysHotel.FCS_Carbon_UUID; string FCS_SOS_UUID = host.SysHotel.FCS_SOS_UUID; string FCS_Clean_UUID = host.SysHotel.FCS_Clean_UUID; string FCS_TouSu_UUID = host.SysHotel.FCS_TouSu_UUID; string FCS_MenCi_Open = host.SysHotel.FCS_MenCi_Open; string FCS_MenCi_Close = host.SysHotel.FCS_MenCi_Close; string FCS_RCU_Online = host.SysHotel.FCS_RCU_Online; string FCS_RCU_Offline = host.SysHotel.FCS_RCU_Offline; string HOSTNUMBER = host.HostNumber; string HOST_MAC = host.MAC; string HOTEL_CODE = host.SysHotel.Code; string ROOMNUMBER = host.RoomNumber; DateTime now = DateTime.Now; bool isInsert = false; StepTongJi.SendInfo(4.3, "Task开始执行设备信息处理", ContextMessageId, ismonitor); //StringBuilder sbSQL; foreach (var device in devices) { //代码太复杂 没看懂 //碳达人,可以直接判断 设备类型即可 //sbSQL = new StringBuilder(); int status = 1;//状态:1开,2关 if (device.Value.Address.Split('.').Length > 2)//处理指令场景 { #region 处理场景 try { //sbSQL.Append("UPDATE tb_HostScene SET "); var hostScene = HostSceneRepository.Get(host.ID, device.Value.Address); if (hostScene == null) { var roomTypeScene = RoomTypeSceneRepository.Get(host.RoomType.ID, device.Value.Address); if (roomTypeScene == null) { continue; } isInsert = true; hostScene = new HostScene() { HostID = host.RoomType.ID, Scene = roomTypeScene, Status = 2, Time = 0, UpdateTime = now }; } //处理回路当天开启时长 status = device.Value.StatusReceiver & 0x00FF; switch (status) { case 2://回路关闭 if (hostScene.Status != 2) { if (hostScene.UpdateTime.HasValue) { hostScene.Time += Convert.ToInt32((now - hostScene.UpdateTime.Value).TotalMinutes); //sbSQL.Append("Time=" + hostScene.Time + ","); } hostScene.UpdateTime = now; //sbSQL.Append("UpdateTime=GETDATE(),"); } break; default://回路开启 if (hostScene.Status == 2) { hostScene.UpdateTime = now; //sbSQL.Append("UpdateTime=GETDATE(),"); } break; } hostScene.Status = status; //sbSQL.Append("Status=" + status); if (isInsert) { isInsert = false; HostSceneRepository.Save(hostScene); } else { //sbSQL.Append(" WHERE HostID=" + hostScene.HostID + " AND RoomTypeSceneID=" + hostScene.Scene.ID); HostSceneRepository.Update(hostScene);//sbSQL.ToString()); } } catch (Exception ex) { logger.Error("ProcessModal_NEW_NEW: " + ex.Message); } #endregion } else { //sbSQL.Append("UPDATE tb_HostModal SET "); //标记状态: //0关闭设备, //1打开设备且当前设备处于关闭状态, //2打开设备且当前设备处于打开状态 int flag = 2; //P4:设备执行状态 //0x01:设置节能状态 //0x02:设置全局亮度节能 //0x03:设定温度节能 //P5 设备内容 //Bit4~7:节能关触发来源 //0x00:无效 //0x01:亮度 不符合节能 //0x02:温度 不符合节能 //Bit0~3:节能状态 //0x01:开 //0x02:关 //说明是碳达人 #region 碳达人 if (device.Key.StartsWith("054")) { try { //里面包含了P4和P5 var iii = device.Value.StatusReceiver; byte[] bbbddd = BitConverter.GetBytes(iii); byte[] bba = new byte[] { bbbddd[1] }; BitArray bitArray = new BitArray(bba); //这个是状态 var qqq1 = bitArray.Cast().Take(4).ToArray(); //这个是触发来源 var qqq2 = bitArray.Cast().Skip(4).Take(4).ToArray(); //节能状态 byte hhhg1 = Tools.CombineBitsToByte(qqq1[3], qqq1[2], qqq1[1], qqq1[0]); //节能关触发来源 byte hhhg2 = Tools.CombineBitsToByte(qqq2[3], qqq2[2], qqq2[1], qqq2[0]); string st = ""; string current_status = ""; if (hhhg1 == 0x01) { current_status = "open"; } else if (hhhg1 == 0x02) { current_status = "close"; } else { current_status = "unknow"; } if (hhhg2 == 0x01) { st = "brightness"; } else if (hhhg2 == 0x02) { st = "temperature"; } else { } //int hostid = host.ID; //StringBuilder sb = new StringBuilder(); //sb.Append(CacheKey.CarbonVIP_Prefix); //sb.Append("_"); //sb.Append(hostid.ToString()); //string Key = sb.ToString(); //CSRedisCacheHelper.Set(Key, current_status); //var data = CSRedisCacheHelper.Get(Key); //if (!string.IsNullOrEmpty(data)) //{ // if (!current_status.Equals(data)) // { // CarbonDataSend(host, hhhg1); // } //} //else //{ // CarbonDataSend(host, hhhg1); //} CarbonDataSend(host, hhhg1); var nfc = CarbonScene_SetRepository.GetDataBy(host.ID); if (nfc != null) { nfc.HostID = host.ID; nfc.TriggerSource = st; nfc.Status = current_status; nfc.CreateTime = DateTime.Now.ToLocalTime(); CarbonScene_SetRepository.UpdateData(nfc); } else { CarbonScene ccc = new CarbonScene(); ccc.HostID = host.ID; ccc.TriggerSource = st; ccc.Status = current_status; ccc.CreateTime = DateTime.Now.ToLocalTime(); CarbonScene_SetRepository.Add(ccc); } } catch (Exception ex) { logger.Error("CarbonVIP: " + ex.Message); logger.Error(ex.StackTrace); } } #endregion #region 处理回路 //如果找不到直接返回 string FKey1 = CacheKey.HostModalStatus_BoolFilterPrefix + "_" + host.ID + "_" + device.Value.Address; var ExistsFlag = CSRedisCacheHelper.Get_Partition(FKey1); if (ExistsFlag != 0) { continue; } string KKey = CacheKey.HostModalStatus_Prefix + "_" + host.ID + "_" + device.Value.Address; var hostModal = CSRedisCacheHelper.Get_Partition(KKey); if (hostModal != null) { } else { //这里有点问题,如果一个Model删除了,又更新了,那它的ID就变了。但是内存中记录的没变,所以这里会出问题 var hostModal_old = HostModalRepository.Get(host.ID, device.Value.Address); if (hostModal_old != null) { HostModal_Cache c = new HostModal_Cache(); c.HostID = hostModal_old.HostID; c.ModalType = hostModal_old.Modal.Type; c.AirConditionData = new AirConditionData(); c.Modal = new RoomTypeModalCache() { RoomTypeID = hostModal_old.Modal.RoomType.ID, ID = hostModal_old.Modal.ID, Name = hostModal_old.Modal.Name, ModalAddress = hostModal_old.Modal.ModalAddress, ActiveIndicator = hostModal_old.Modal.ActiveIndicator, Sort = hostModal_old.Modal.Sort }; hostModal = c; } else { hostModal = null; } } if (hostModal != null) { switch (hostModal.ModalType) { case DeviceType.Dimmer://LED case DeviceType.Strip://灯带 case DeviceType.Traic://可控硅 case DeviceType.PWMDimmer://PWM调光 case DeviceType.PWMExpand://PWM扩展 case DeviceType.PBLED://PB LED case DeviceType.LVout://弱电输出 case DeviceType.PB20: case DeviceType.PB20_LD: case DeviceType.PB20_LS: #region 处理逻辑 int brightness = device.Value.StatusReceiver >> 8; if (hostModal.Brightness != brightness)//调光类型:亮度从0到100,且设备有变化时才去更改状态 { if (brightness == 0)//设备关 { flag = 0; hostModal.Status = 2; hostModal.Brightness = 0; //MemoryModal.Status = 2; //MemoryModal.Brightness = 0; //sbSQL.Append("Status=2,Brightness=0,"); } else { flag = hostModal.Status != 1 ? 1 : 2;//如果原来不是打开状态,才创建新的回路记录 hostModal.Status = 1; hostModal.Brightness = brightness; //MemoryModal.Status = 1; //MemoryModal.Brightness = brightness; //sbSQL.Append("Status=1,Brightness=" + hostModal.Brightness + ","); } } #endregion break; case DeviceType.AirDetect://空气质量检测 hostModal.Status = 1; hostModal.Brightness = device.Value.StatusReceiver; break; case DeviceType.Relay://主机继电器 case DeviceType.Expand://扩展继电器 case DeviceType.ServiceInfo://服务信息 case DeviceType.SwitchExpand://开关扩展 case DeviceType.A9IORelay://A9IO继电器 case DeviceType.CardPower://取电 case DeviceType.Curtain://窗帘 case DeviceType.InFrared://红外感应 #region 红外 SOS 清理 等服务信息 status = device.Value.StatusReceiver & 0x00FF; string code = host.SysHotel.Code; if (device.Value.Address.Equals("004000008")) { Dictionary dica = new Dictionary(); string ti = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); dica.Add("hotelcode", host.SysHotel.Code); dica.Add("roomnum", host.RoomNumber); dica.Add("devicetype", "sos"); dica.Add("triggertime", ti); dica.Add("status", status.ToString()); string str = Newtonsoft.Json.JsonConvert.SerializeObject(dica); //var client1 = new RestClient(MQTTInfo_report_url); //var request1 = new RestRequest("/", Method.POST); ////注意方法是POST ////两个参数名字必须是 topic 和payload ,区分大小写的 //request1.AddParameter("topic", "blw/sos/report/"+code); //request1.AddParameter("payload", str); //logger.Error("publish sos data,"+code+","+host.RoomNumber); //client1.ExecuteAsync(request1, (response) => { }); BLWMQTT.MQTTPublishData("blw/sos/report/" + code, str); } try { if (status == 1)//设备开 { #region 如果是睡眠模式就息屏 //息屏是:1 //创维电视 if (host.SysHotel.IsUseSkyworthTV) { string hotelcode = host.SysHotel.Code; string roomnum = host.RoomNumber; //睡眠息屏是1 if (hostModal.Modal.Name.Equals("睡眠息屏")) { logger.Error("SkyWorthTV send data"); SkyWorth.Invoke(hotelcode, host.RoomNumber, host.SysHotel.SkyworthTVauthCode, 1); } //呼叫前台 if (host.SysHotel.Code == "1003") { if (hostModal.Modal.ModalAddress.Equals("004000023")) { logger.Error("呼叫前台"); SkyWorth.Invoke(hotelcode, host.RoomNumber, host.SysHotel.SkyworthTVauthCode, 4); } } } //TCL电视 if (host.SysHotel.IsUseTCLTV) { string hotelcode = host.SysHotel.Code; string roomnum = host.RoomNumber; string TCLcuid = host.TCLCUID; string skillid = host.TCLSkillID; //如果是息屏 //004000022 //if (hostModal.Modal.Name.Equals("睡眠息屏")) //{ //} if (device.Value.Address.Equals("004000022")) { TCLCommon.SendData(hotelcode, roomnum, TCLcuid, skillid, "SLEEP"); } //呼叫前台 if (hostModal.Modal.ModalAddress.Equals("004000023")) { TCLCommon.SendData(hotelcode, roomnum, TCLcuid, skillid, "SIP"); } } #endregion #region 设备开 if (hostModal.Status != 1)//设备有变化时才去更改状态 { flag = 1; hostModal.Status = 1; hostModal.Brightness = 100; //FCS推送 //SOS if (hostModal.Modal.ModalAddress.Equals("004000008")) { //SOS推送 RR.FCS_PushData(FCS_SOS_UUID, UUID, PropertyUUID, FCSLoginUrl, FCSLoginUserName, FCSLoginPassWord, HOTEL_CODE, ROOMNUMBER); } //清理 if (hostModal.Modal.ModalAddress.Equals("004000003")) { //一个房间的清理在5分钟之内 只能按一次 开的状态 string CleanTrigger = CacheKey.CleanFCS_TriggerCount + "_" + HOSTNUMBER; int str = CSRedisCacheHelper.Get_Partition(CleanTrigger); //没有数据才能使用 if (str == 0) { RR.FCS_PushData(FCS_Clean_UUID, UUID, PropertyUUID, FCSLoginUrl, FCSLoginUserName, FCSLoginPassWord, HOTEL_CODE, ROOMNUMBER, "", HOSTNUMBER); } } if (hostModal.Modal.ModalAddress.Equals("004000004")) { //一键投诉推送 RR.FCS_PushData(FCS_TouSu_UUID, UUID, PropertyUUID, FCSLoginUrl, FCSLoginUserName, FCSLoginPassWord, HOTEL_CODE, ROOMNUMBER); } } #endregion } else//设备关 { if (hostModal.Status != status)//设备有变化时才去更改状态,窗帘6是停,其他是关 { flag = 0; } //清理 if (hostModal.Modal.ModalAddress.Equals("004000003")) { //通过LocationUUID确定订单号 string OrderUUID = CSRedisCacheHelper.Get_Partition(CacheKey.FCSRoom_Mapping_Order + "_" + UUID, 3); RR.FCS_CancelOrderJob(UUID, PropertyUUID, FCSLoginUrl, FCSLoginUserName, FCSLoginPassWord, HOTEL_CODE, ROOMNUMBER, OrderUUID); //删除定单 通过LocationUUID CSRedisCacheHelper.Del_Partition(CacheKey.FCSRoom_Mapping_Order + "_" + UUID, 3); } hostModal.Status = status; hostModal.Brightness = 0; } } catch (Exception ex) { logger.Error("取电数据有异常: " + host.SysHotel.Code + "," + host.RoomNumber + " Msg:" + ex.Message); } CSRedisCacheHelper.Set_Partition(KKey, hostModal); #endregion #region 取电,门磁 switch (hostModal.Modal.ModalAddress) { case "004000013"://门磁 #region 门磁 bool doorLockStatus = status == 1 ? true : false; if (host.DoorLockStatus != doorLockStatus) { host.DoorLockStatus = doorLockStatus; //FCS推送 //门磁 if (doorLockStatus) { RR.FCS_PushData(FCS_MenCi_Open, UUID, PropertyUUID, FCSLoginUrl, FCSLoginUserName, FCSLoginPassWord, HOTEL_CODE, ROOMNUMBER); } else { RR.FCS_PushData(FCS_MenCi_Close, UUID, PropertyUUID, FCSLoginUrl, FCSLoginUserName, FCSLoginPassWord, HOTEL_CODE, ROOMNUMBER); } HostRepository.SetDoorLockStatus(host, doorLockStatus); } #endregion break; case "004000001"://取电 #region 取电开关 #region 这个逻辑可能会用到 //0关闭设备, //1打开设备且当前设备处于关闭状态, //取电 //CommonEntity.DataTongJi.MTakeCardData t = new DataTongJi.MTakeCardData(); //t.HostNUMBER = HOSTNUMBER; //t.HotelCode = HOTEL_CODE; //t.Status = Convert.ToByte(device.Value.StatusReceiver); //t.LastUpdateTime = DateTime.Now; ////不管是断电还是取电都要记录 //if (flag == 1||flag==0) //{ // string sss = Newtonsoft.Json.JsonConvert.SerializeObject(t); // CSRedisCacheHelper.Publish("redis-takecard_change", sss); //} //断电 //if (flag == 0) //{ // string sss = Newtonsoft.Json.JsonConvert.SerializeObject(t); // CSRedisCacheHelper.Publish("redis-takecard_change", sss); //} #endregion //拨卡操作 if (flag == 0 && host.RoomCard != null) { host.RoomCard = null; HostRepository.SetRoomCard(host, null);//拔卡操作 } else if (flag == 1 && host.RoomCard == null) { //CSRedisCacheHelper.HMSet(CacheKey.TakeCardOnLine,host.SysHotel.Code+"###"+ host.RoomNumber); RoomCardType roomCardType = null; #region 获取有人房卡类型 string MemoryCardKey = "MemoryRoomCardPrefix_1"; object ooo = MemoryCacheHelper.Get(MemoryCardKey); if (ooo != null) { roomCardType = ooo as RoomCardType; } else { roomCardType = RoomCardTypeRepository.Get(1);//获取有人房卡类型 MemoryCacheHelper.SlideSet(MemoryCardKey, roomCardType); } #endregion #region 获取当前酒店独属 这个房间的卡 RoomCard roomCard = null; string GetRoomCardBy = "GetRoomCardBy_" + roomCardType.ID + "_" + host.SysHotel.ID; object ooo1 = MemoryCacheHelper.Get(GetRoomCardBy); if (ooo1 != null) { roomCard = ooo as RoomCard; } else { roomCard = RoomCardRepository.Get(roomCardType, host.SysHotel.ID); if (roomCard != null) { MemoryCacheHelper.Set(GetRoomCardBy, roomCard); } } #endregion if (roomCard == null)//如果该房卡类型未创建记录,自动创建 { roomCard = new RoomCard(); roomCard.CardNumber = "1"; roomCard.RoomCardType = roomCardType; roomCard.HotelID = host.SysHotel.ID; RoomCardRepository.Save(roomCard); } host.RoomCard = roomCard; HostRepository.SetRoomCard(host, roomCard);//插卡操作 } #region 语音机器人 if (flag != 2)//取电或断电时处理 { bool not_trigger = false; string key = PoolOverFlowKey + "_" + host.HostNumber; object data19 = MemoryCacheHelper.Get(key); if (data19 != null) { not_trigger = true; } if (IsTriggerWelcomeMsg == false) { not_trigger = true; } bool SmartIsDisable = SmartRobotDisable(host); //如果没有禁用 if (SmartIsDisable == false && not_trigger == false) { //1、如果有绑定小度,小度处理 if (!string.IsNullOrEmpty(host.XiaoDuCUID)) { string accessToken1 = SysOauth2Repository.GetXiaoDuToken(); if (!string.IsNullOrEmpty(accessToken1)) { if (flag == 1 && !string.IsNullOrEmpty(host.SysHotel.WelcomeSpeech))//取电打开时,播放欢迎词 { var ttt = new Tuple(accessToken1, host); Task.Factory.StartNew((state) => { var tuple_a = state as Tuple; string accessToken = tuple_a.Item1; var a = tuple_a.Item2; var myarray = a.XiaoDuCUID.Split(','); var a1 = a.SysHotel.WelcomeSpeech; var a2 = a.SysHotel.Code; var a3 = a.RoomNumber; //foreach (string cuid in host.XiaoDuCUID.Split(','))//多个小度英文逗号隔开 foreach (string cuid in myarray)//多个小度英文逗号隔开 { //XiaoDuOperation.UploadWebhook(accessToken, cuid, host.SysHotel.WelcomeSpeech, host.SysHotel.Code, host.RoomNumber); XiaoDuOperation.UploadWebhook(accessToken, cuid, a1, a2, a3); Interface3Log w1 = new Interface3Log(); w1.HotelCode = a2; w1.RoomNumber = a3; w1.TriggerTime = DateTime.Now; w1.CommandType = ChangLiangValue.XiaoDu; WelcomeAction w2 = new WelcomeAction(); w2.VoiceDeviceClass = "小度"; w2.CUID = cuid; w2.CommandType = "欢迎词"; w1.ActionData = new HttpActionData() { RequestData = Newtonsoft.Json.JsonConvert.SerializeObject(w2) }; var q1 = Newtonsoft.Json.JsonConvert.SerializeObject(w1); CSRedisCacheHelper.Publish(CacheKey.InvokeHttpInterface, q1); } }, ttt); } else if (flag == 0) { if (host.SysHotel.IsPowerOffResetXiaoDu)//断电重置小度 { var ttt = new Tuple(accessToken1, host); Task.Factory.StartNew((state) => { var tuple_a = state as Tuple; string accessToken = tuple_a.Item1; var a = tuple_a.Item2; var myarray = a.XiaoDuCUID.Split(','); var a1 = a.SysHotel.WelcomeSpeech; var a2 = a.SysHotel.Code; var a3 = a.RoomNumber; //foreach (string cuid in host.XiaoDuCUID.Split(','))//多个小度英文逗号隔开 foreach (string cuid in myarray)//多个小度英文逗号隔开 { //XiaoDuOperation.PostWebRequestToXiaoDu(accessToken, cuid, new XiaoDuParamJson() { method = "reset" }, host.SysHotel.Code, host.RoomNumber);//重置小度 XiaoDuOperation.PostWebRequestToXiaoDu(accessToken, cuid, new XiaoDuParamJson() { method = "reset" }, a2, a3);//重置小度 Interface3Log w1 = new Interface3Log(); w1.HotelCode = a2; w1.RoomNumber = a3; w1.TriggerTime = DateTime.Now; w1.CommandType = ChangLiangValue.XiaoDu; WelcomeAction w2 = new WelcomeAction(); w2.VoiceDeviceClass = "小度"; w2.CUID = cuid; w2.CommandType = "断电重置"; //w1.ActionData = new HttpActionData() { RequestData = w2 }; w1.ActionData = new HttpActionData() { RequestData = Newtonsoft.Json.JsonConvert.SerializeObject(w2) }; var q1 = Newtonsoft.Json.JsonConvert.SerializeObject(w1); CSRedisCacheHelper.Publish(CacheKey.InvokeHttpInterface, q1); } }, ttt); } else if (!string.IsNullOrEmpty(host.SysHotel.GoodbyeSpeech))//断电,播放离房提示 { var ttt = new Tuple(accessToken1, host); Task.Factory.StartNew((state) => { var tuple_a = state as Tuple; string accessToken = tuple_a.Item1; var a = tuple_a.Item2; var myarray = a.XiaoDuCUID.Split(','); var a1 = a.SysHotel.GoodbyeSpeech; var a2 = a.SysHotel.Code; var a3 = a.RoomNumber; //foreach (string cuid in host.XiaoDuCUID.Split(','))//多个小度英文逗号隔开 foreach (string cuid in myarray)//多个小度英文逗号隔开 { //XiaoDuOperation.UploadWebhook(accessToken, cuid, host.SysHotel.GoodbyeSpeech, host.SysHotel.Code, host.RoomNumber); XiaoDuOperation.UploadWebhook(accessToken, cuid, a1, a2, a3); Interface3Log w1 = new Interface3Log(); w1.HotelCode = a2; w1.RoomNumber = a3; w1.TriggerTime = DateTime.Now; w1.CommandType = ChangLiangValue.XiaoDu; WelcomeAction w2 = new WelcomeAction(); w2.VoiceDeviceClass = "小度"; w2.CUID = cuid; w2.CommandType = "欢送词"; w1.ActionData = new HttpActionData() { RequestData = Newtonsoft.Json.JsonConvert.SerializeObject(w2) }; //w1.ActionData = new HttpActionData() { RequestData = w2 }; var q1 = Newtonsoft.Json.JsonConvert.SerializeObject(w1); CSRedisCacheHelper.Publish(CacheKey.InvokeHttpInterface, q1); } }, ttt); } } } } //2、如果有绑定天猫精灵,天猫精灵处理 if (!string.IsNullOrEmpty(host.TianMaoCUID)) { if (flag == 1 && !string.IsNullOrEmpty(host.SysHotel.WelcomeSpeech))//取电打开时,播放欢迎词 { if (host.SysHotel.Code.Equals("1197")) { logger.Error("天猫机器人调用:取电Flag= " + flag + ", 房间号:" + host.RoomNumber); } else { Task.Factory.StartNew((state) => { var hhh = state as Host; var a = hhh.TianMaoCUID.Split(','); var b = hhh.SysHotel.WelcomeSpeech; string bb = hhh.SysHotel.WelcomeBGM; //if (!string.IsNullOrEmpty(bb)) //{ // bb = "https://www.boonlive-rcu.com/welcomebgm/" + bb; //} var c = hhh.SysHotel.Code; var d = hhh.RoomNumber; var hotelid = hhh.SysHotel.ID; foreach (string cuid in a)//多个英文逗号隔开 { //if (!string.IsNullOrEmpty(bb)) //{ // TianMaoOperation.PostWebRequestToTianMao("PushWelcome", // Newtonsoft.Json.JsonConvert.SerializeObject(new { HotelId = cuid.Split('&')[0], RoomNo = cuid.Split('&')[1], WelcomeText = b, MusicUrl = bb }), c, d);//通知天猫精灵播放欢迎词 //} //else //{ // TianMaoOperation.PostWebRequestToTianMao("PushWelcome", // Newtonsoft.Json.JsonConvert.SerializeObject(new { HotelId = cuid.Split('&')[0], RoomNo = cuid.Split('&')[1], WelcomeText = b }), c, d);//通知天猫精灵播放欢迎词 //} if (!string.IsNullOrEmpty(bb)) { string ffg = "https://www.boonlive-rcu.com/welcomebgm/" + bb; TianMaoOperation.PostWebRequestToTianMao("PushWelcome", Newtonsoft.Json.JsonConvert.SerializeObject(new { HotelId = cuid.Split('&')[0], RoomNo = cuid.Split('&')[1], WelcomeText = b, WelcomeMusicUrl = ffg }), c, d);//通知天猫精灵播放欢迎词 } else { TianMaoOperation.PostWebRequestToTianMao("PushWelcome", Newtonsoft.Json.JsonConvert.SerializeObject(new { HotelId = cuid.Split('&')[0], RoomNo = cuid.Split('&')[1], WelcomeText = b }), c, d);//通知天猫精灵播放欢迎词 } Interface3Log w1 = new Interface3Log(); w1.HotelCode = c; w1.RoomNumber = d; w1.TriggerTime = DateTime.Now; w1.CommandType = ChangLiangValue.TianMao; WelcomeAction w2 = new WelcomeAction(); w2.VoiceDeviceClass = "天猫"; w2.CUID = cuid; w2.CommandType = "欢送词"; w1.ActionData = new HttpActionData() { RequestData = Newtonsoft.Json.JsonConvert.SerializeObject(w2) }; //w1.ActionData = new HttpActionData() { RequestData = w2 }; var q1 = Newtonsoft.Json.JsonConvert.SerializeObject(w1); CSRedisCacheHelper.Publish(CacheKey.InvokeHttpInterface, q1); } }, host); } } else if (flag == 0) { if (host.SysHotel.IsPowerOffResetXiaoDu)//断电重置 { Task.Factory.StartNew((state) => { var hhh = state as Host; var a = hhh.TianMaoCUID.Split(','); var b = hhh.SysHotel.WelcomeSpeech; var c = hhh.SysHotel.Code; var d = hhh.RoomNumber; foreach (string cuid in a)//多个英文逗号隔开 { TianMaoOperation.PostWebRequestToTianMao("CheckoutWithAK", Newtonsoft.Json.JsonConvert.SerializeObject(new { HotelId = cuid.Split('&')[0], RoomNo = cuid.Split('&')[1] }), c, d);//重置天猫精灵 Interface3Log w1 = new Interface3Log(); w1.HotelCode = c; w1.RoomNumber = d; w1.TriggerTime = DateTime.Now; w1.CommandType = ChangLiangValue.TianMao; WelcomeAction w2 = new WelcomeAction(); w2.VoiceDeviceClass = "天猫"; w2.CUID = cuid; w2.CommandType = "断电重置"; w1.ActionData = new HttpActionData() { RequestData = Newtonsoft.Json.JsonConvert.SerializeObject(w2) }; //w1.ActionData = new HttpActionData() { RequestData = w2 }; var q1 = Newtonsoft.Json.JsonConvert.SerializeObject(w1); CSRedisCacheHelper.Publish(CacheKey.InvokeHttpInterface, q1); } }, host); } else if (!string.IsNullOrEmpty(host.SysHotel.GoodbyeSpeech))//取电关闭时,播放离房提示 { Task.Factory.StartNew((state) => { var hhh = state as Host; var a = hhh.TianMaoCUID.Split(','); var b = hhh.SysHotel.GoodbyeSpeech; var c = hhh.SysHotel.Code; var d = hhh.RoomNumber; //foreach (string cuid in host.TianMaoCUID.Split(','))//多个英文逗号隔开 //{ // TianMaoOperation.PostWebRequestToTianMao("PushWelcome", // Newtonsoft.Json.JsonConvert.SerializeObject(new { HotelId = cuid.Split('&')[0], RoomNo = cuid.Split('&')[1], WelcomeText = host.SysHotel.GoodbyeSpeech }), host.SysHotel.Code, host.RoomNumber);//通知天猫精灵播放离房提示 //} foreach (string cuid in a)//多个英文逗号隔开 { TianMaoOperation.PostWebRequestToTianMao("PushWelcome", Newtonsoft.Json.JsonConvert.SerializeObject(new { HotelId = cuid.Split('&')[0], RoomNo = cuid.Split('&')[1], WelcomeText = b }), c, d);//通知天猫精灵播放离房提示 Interface3Log w1 = new Interface3Log(); w1.HotelCode = c; w1.RoomNumber = d; w1.TriggerTime = DateTime.Now; w1.CommandType = ChangLiangValue.TianMao; WelcomeAction w2 = new WelcomeAction(); w2.VoiceDeviceClass = "天猫"; w2.CUID = cuid; w2.CommandType = "欢送词"; w1.ActionData = new HttpActionData() { RequestData = Newtonsoft.Json.JsonConvert.SerializeObject(w2) }; //w1.ActionData = new HttpActionData() { RequestData = w2 }; var q1 = Newtonsoft.Json.JsonConvert.SerializeObject(w1); CSRedisCacheHelper.Publish(CacheKey.InvokeHttpInterface, q1); } }, host); } } } } //3、取电或断电时季节空调处理 HotelSeason hotelSeason = null; string KKKAAA = "Season_" + host.SysHotel.ID; string KongZhi = "Season_WuKong" + host.SysHotel.ID; object ShiFouWeiKong = MemoryCacheHelper.Get(KongZhi); int bf = 1; if (ShiFouWeiKong != null) { bf = (int)ShiFouWeiKong; } if (bf == 0) { var UIO = MemoryCacheHelper.Get(KKKAAA); if (UIO != null) { hotelSeason = (HotelSeason)UIO; } else { hotelSeason = HotelSeasonRepository.LoadByHotelID(host.SysHotel.ID);//获取该酒店下季节设置记录 if (hotelSeason != null) { MemoryCacheHelper.Set(KongZhi, 0, DateTimeOffset.Now.AddMinutes(20)); MemoryCacheHelper.Set(KKKAAA, hotelSeason, DateTimeOffset.Now.AddMinutes(20)); } else { MemoryCacheHelper.Set(KongZhi, 1, DateTimeOffset.Now.AddMinutes(20)); } } } else { hotelSeason = HotelSeasonRepository.LoadByHotelID(host.SysHotel.ID);//获取该酒店下季节设置记录 if (hotelSeason != null) { MemoryCacheHelper.Set(KongZhi, 0, DateTimeOffset.Now.AddMinutes(20)); MemoryCacheHelper.Set(KKKAAA, hotelSeason, DateTimeOffset.Now.AddMinutes(20)); } else { MemoryCacheHelper.Set(KongZhi, 1, DateTimeOffset.Now.AddMinutes(20)); } } if (hotelSeason != null) { int conditonType = (flag == 1 ? 2 : 3); List list = HotelAirControlRepository.LoadAll(host.SysHotel.ID, conditonType, true); List hostModals = HostModalRepository.LoadByHostID(host.ID).Where(r => r.Modal.Type == DeviceType.AirConditioner && r.Modal.ActiveIndicator).ToList();//获取启用的空调回路 if (list.Count > 0 && hostModals.Count > 0) { System.Reflection.PropertyInfo[] properties = typeof(HotelSeason).GetProperties();//获取所有属性 foreach (HotelAirControl item in list) { foreach (System.Reflection.PropertyInfo prop in properties)//遍历属性 { if (prop.Name == "Month" + DateTime.Now.Month.ToString() && Convert.ToInt16(prop.GetValue(hotelSeason, null)) == item.Season)//当前月份所属该季节,则发送命令给rcu设置空调 { System.Threading.Thread.Sleep(item.DelayTime * 1000);//延迟执行 var D2 = item; foreach (HostModal hostModal1 in hostModals) { Device device1 = new Device(); device1.Address = hostModal1.Modal.ModalAddress; device1.AddressType = AddressType.DeviceAddress; device1.Type = DeviceType.AirConditioner; device1.Status = (byte)D2.Status; device1.Brightness = 0; device1.Temperature = (byte)D2.SettingTemp; device1.FanSpeed = (byte)D2.FanSpeed; device1.Mode = (byte)D2.Mode; device1.Valve = 0; device1.AirExecMode = (D2.Status << 14) + (D2.Mode << 12) + (D2.FanSpeed << 10) + (0 << 8) + D2.SettingTemp;//空调执行方式和内容 //这里只需要host的mac和number或者 ip DeviceControlReceiver.Send(host, device1); } break; } } } } } } #endregion #endregion break; } break; #endregion case DeviceType.CarbonVIP: //碳达人 #region Carbon var iii = device.Value.StatusReceiver; byte[] bbbddd = BitConverter.GetBytes(iii); byte[] bba = new byte[] { bbbddd[1] }; BitArray bitArray = new BitArray(bba); //这个是状态 var qqq1 = bitArray.Cast().Take(4).ToArray(); //节能状态 byte hhhg1 = Tools.CombineBitsToByte(qqq1[3], qqq1[2], qqq1[1], qqq1[0]); //open if (hhhg1 == 0x01) { if (hostModal.Status != 1)//设备有变化时才去更改状态 { flag = 1; hostModal.Status = 1; //sbSQL.Append("Status=1,Brightness=100,"); //MemoryModal.Status = 1; } } //close else if (hhhg1 == 0x02) { if (hostModal.Status != status)//设备有变化时才去更改状态,窗帘6是停,其他是关 { flag = 0; hostModal.Status = status; //MemoryModal.Status = status; } } else { } break; #endregion case DeviceType.AirConditioner://空调 #region 空调 //BitArray bit = new BitArray(device.Value.StatusReceiver); ushort StatusReceiver = device.Value.StatusReceiver; status = device.Value.StatusReceiver >> 15;//开关 int mode = (device.Value.StatusReceiver >> 13) & 0x03;//模式 int fanSpeed = (device.Value.StatusReceiver >> 11) & 0x03;//风速 int valve = (device.Value.StatusReceiver >> 10) & 0x01;//阀门 int temperature = (device.Value.StatusReceiver >> 5) & 0x1F;//设定温度 int currentTemp = device.Value.StatusReceiver & 0x01F;//当前温度(室内温度) //status = StatusReceiver >> 15;//开关 //int mode = (StatusReceiver >> 12) & 0x03;//模式 //int fanSpeed = (StatusReceiver >> 11) & 0x03;//风速 //int valve = (StatusReceiver >> 10) & 0x01;//阀门 //int temperature = (StatusReceiver >> 5) & 0x1F;//设定温度 //int currentTemp = StatusReceiver & 0x01F;//当前温度(室内温度) if (status == 1)//设备开 { string ADDDDD = device.Value.Address; string Key = CacheKey.KongTiaoAlert + "_" + HOSTNUMBER + "_" + ADDDDD; AirConditionAlert alert_d = new AirConditionAlert(); alert_d.HostNumber = HOSTNUMBER; alert_d.HotelCode = HOTEL_CODE; alert_d.DeviceAddress = ADDDDD; alert_d.SetTemperature = temperature; alert_d.CurrentTemperature = currentTemp; alert_d.UpdateDateTime = DateTime.Now; //if (temperature != currentTemp) //{ // var take_air = CSRedisCacheHelper.Get_Partition(Key); // if (!take_air.Equals(default(AirConditionAlert))) // { // // 结构体为空(即所有字段都为默认值) // } // else // { // CSRedisCacheHelper.Set_PartitionWithTime(Key, alert_d, 30); // } //} //else //{ // CSRedisCacheHelper.Del_Partition(Key); //} if (hostModal.Status != 1)//设备有变化时才去更改状态 { flag = 1; hostModal.Status = 1; hostModal.Brightness = 100; //sbSQL.Append("Status=1,Brightness=100,"); //MemoryModal.Status = 1; //MemoryModal.Brightness = 100; } //如果设备状态为开 //而且当前房间 插卡 //如果设置有 延时关闭就产生条任务 string TakeCardKey = CacheKey.HostModalStatus_Prefix + "_" + host.ID + "_" + "004000001"; int id = host.SysHotel.ID; int hostid = host.ID; string hotelcode = host.SysHotel.Code; string roomnum = host.RoomNumber; string LieKey = CacheKey.LieECOKey + "_" + id; var CardStatus = CSRedisCacheHelper.Get_Partition(TakeCardKey); if (CardStatus != null) { int SStatus = CardStatus.Status; //如果取电为开 if (SStatus == 1) { List list = null; var takedata = CSRedisCacheHelper.Get_Partition>(LieKey, 1); if (takedata != null) { list = takedata; } if (list != null && list.Count > 0) { //获取时间 foreach (LieECO item in list) { string st = item.StartTime; string et = item.EndTime; var st1 = st.Split(':'); int hh = 0; int.TryParse(st1[0], out hh); int mm = 0; int.TryParse(st1[1], out mm); var et1 = et.Split(':'); int hh1 = 0; int.TryParse(et1[0], out hh1); int mm1 = 0; int.TryParse(et1[1], out mm1); var n = DateTime.Now; int y = n.Year; int m = n.Month; int d = n.Day; var st2 = new DateTime(y, m, d, hh, mm, 0); var et2 = new DateTime(y, m, d, hh1, mm1, 0); if (DateTime.Now >= st2 && DateTime.Now <= et2) { int delay = item.DelayTime; //string LieECOTaskKey = CacheKey.LieECOTask + "_" + System.Guid.NewGuid().ToString("N"); string LieECOTaskKey = CacheKey.LieECOTask + "_" + hotelcode + "_" + roomnum; int finallyV = temperature; if (item.AbsEnable) { int ABSV = item.AbsValue; finallyV = ABSV; } if (item.RelativeEnable) { int ReaV = item.RelativeValue; //如果内存中取出的设定温度和 当前温控器的设定温度不一致,说明设置温度有变化 if (hostModal.AirConditionData.SettingTemp != temperature) { if (mode == 1) { //如果是制冷 ,那就将温度调高一些 finallyV = temperature + ReaV; //设置温度也要变化,不然会一直变 } else if (mode == 2) { //如果是制热就不用管 finallyV = temperature - ReaV; } else { finallyV = temperature; } temperature = finallyV; } } LieECOTaskExtra LE = new LieECOTaskExtra(); LE.MissionKey = LieECOTaskKey; LE.HostNUMBER = HOSTNUMBER; LE.MAC = HOST_MAC; LE.FanSpeed = fanSpeed; LE.Mode = mode; LE.ModalAddress = device.Value.Address; LE.SetTemperatureValue = finallyV; CSRedisCacheHelper.Set_Partition(LieECOTaskKey, LE, 1); string ti = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); KongTiaoTimer k = new KongTiaoTimer(); k.HotelID = id; k.HostID = hostid; k.HotelCode = hotelcode; k.RoomNo = roomnum; k.MissonKey = LieECOTaskKey; k.IsCancel = 0; k.CreateTime = ti; k.StartTime = ti; k.EndTime = DateTime.Now.AddMinutes(delay).ToString("yyyy-MM-dd HH:mm:ss"); k.CreateDate = DateTime.Now.ToString("yyyy-MM-dd"); MissionRequestData UUA = new MissionRequestData(); UUA.DelayTimer = delay; UUA.KT = k; string jsstr = Newtonsoft.Json.JsonConvert.SerializeObject(UUA); //给 任务管理系统 发送消息 var client1 = new RestClient(Missionsys_Address); var request1 = new RestRequest("api/index", Method.POST); logger.Error("ECO系统发送了数据:" + jsstr + Missionsys_Address + "API/Index"); request1.AddParameter("jsonData", jsstr); client1.ExecuteAsync(request1, (response) => { }); } } } } } } else//设备关 { if (hostModal.Status != 2)//设备有变化时才去更改状态 { flag = 0; hostModal.Status = 2; hostModal.Brightness = 0; //sbSQL.Append("Status=2,Brightness=0,"); //MemoryModal.Status = 2; //MemoryModal.Brightness = 0; } } hostModal.AirConditionData.AirStatus = status; hostModal.AirConditionData.Mode = mode; hostModal.AirConditionData.FanSpeed = fanSpeed; hostModal.AirConditionData.Valve = valve == 1 ? 1 : 2; hostModal.AirConditionData.UpdateTime = now; //MemoryModal.Mode = mode; //MemoryModal.FanSpeed = fanSpeed; //MemoryModal.Valve = valve == 1 ? 1 : 2; if (temperature == 0 || temperature > 32) { hostModal.AirConditionData.SettingTemp = 32; //MemoryModal.SettingTemp = 32; } else if (temperature < 16) { hostModal.AirConditionData.SettingTemp = 16; //MemoryModal.SettingTemp = 16; } else { hostModal.AirConditionData.SettingTemp = temperature; //MemoryModal.SettingTemp = temperature; } //hostModal.SettingTemp = temperature == 0 ? 32 : temperature; //sbSQL.Append("SettingTemp=" + hostModal.SettingTemp + ","); if (currentTemp == 0 || currentTemp > 32) { hostModal.AirConditionData.CurrentTemp = 32; //MemoryModal.CurrentTemp = 32; } else if (currentTemp < 16) { hostModal.AirConditionData.CurrentTemp = 16; //MemoryModal.CurrentTemp = 16; } else { hostModal.AirConditionData.CurrentTemp = currentTemp; //MemoryModal.CurrentTemp = currentTemp; } //hostModal.CurrentTemp = currentTemp == 0 ? 32 : currentTemp; //sbSQL.Append("CurrentTemp=" + hostModal.CurrentTemp + ","); break; #endregion case DeviceType.FloorHot://地暖 #region 地暖 status = (device.Value.StatusReceiver >> 15) & 0x01;//开关 mode = (device.Value.StatusReceiver >> 13) & 0x03;//模式 valve = (device.Value.StatusReceiver >> 12) & 0x01;//阀门 temperature = (device.Value.StatusReceiver >> 6) & 0x3F;//设定温度 currentTemp = device.Value.StatusReceiver & 0x03F;//当前温度(室内温度) if (status == 1)//设备开 { if (hostModal.Status != 1)//设备有变化时才去更改状态 { flag = 1; hostModal.Status = 1; hostModal.Brightness = 100; //sbSQL.Append("Status=1,Brightness=100,"); //MemoryModal.Status = 1; //MemoryModal.Brightness = 100; } } else//设备关 { if (hostModal.Status != 2)//设备有变化时才去更改状态 { flag = 0; hostModal.Status = 2; hostModal.Brightness = 0; //sbSQL.Append("Status=2,Brightness=0,"); //MemoryModal.Status = 2; //MemoryModal.Brightness = 0; } } hostModal.AirConditionData.SettingTemp = temperature == 0 ? 32 : temperature; //sbSQL.Append("SettingTemp=" + hostModal.SettingTemp + ","); hostModal.AirConditionData.Mode = mode; //sbSQL.Append("Mode=" + hostModal.Mode + ","); hostModal.AirConditionData.Valve = valve == 1 ? 1 : 2; //sbSQL.Append("Valve=" + hostModal.Valve + ","); hostModal.AirConditionData.CurrentTemp = currentTemp == 0 ? 32 : currentTemp; //sbSQL.Append("CurrentTemp=" + hostModal.CurrentTemp + ","); //MemoryModal.SettingTemp = temperature == 0 ? 32 : temperature; //MemoryModal.Mode = mode; //MemoryModal.Valve = valve == 1 ? 1 : 2; //MemoryModal.CurrentTemp = currentTemp == 0 ? 32 : currentTemp; #endregion break; #region 下面的暂时不关心 case DeviceType.TV://电视 status = device.Value.StatusReceiver & 0x00FF; if (status == 1)//设备开 { if (hostModal.Status != 1)//设备有变化时才去更改状态 { flag = 1; hostModal.Status = 1; hostModal.Brightness = 100; //sbSQL.Append("Status=1,Brightness=100,"); //MemoryModal.Status = 1; //MemoryModal.Brightness = 100; } } else//设备关 { if (hostModal.Status != status)//设备有变化时才去更改状态,窗帘6是停,其他是关 { flag = 0; hostModal.Status = status; hostModal.Brightness = 0; //sbSQL.Append("Status=" + status + ",Brightness=0,"); //MemoryModal.Status = status; //MemoryModal.Brightness = 0; } } break; case DeviceType.Music://音乐 status = device.Value.StatusReceiver & 0x00FF;//开关 brightness = (device.Value.StatusReceiver >> 12) & 0x0F;//音量 mode = (device.Value.StatusReceiver >> 8) & 0x0F;//选项 if (status == 1)//设备开 { if (hostModal.Status != 1)//设备有变化时才去更改状态 { flag = 1; hostModal.Status = 1; //sbSQL.Append("Status=1,"); //MemoryModal.Status = 1; } hostModal.Brightness = brightness; //MemoryModal.Brightness = brightness; //sbSQL.Append("Brightness=" + hostModal.Brightness + ","); } else//设备关 { if (hostModal.Status != 2)//设备有变化时才去更改状态 { flag = 0; hostModal.Status = 2; hostModal.Brightness = 0; //sbSQL.Append("Status=2,Brightness=0,"); //MemoryModal.Status = 2; //MemoryModal.Brightness = 0; } } hostModal.AirConditionData.Mode = mode; //sbSQL.Append("Mode=" + hostModal.Mode + ","); //MemoryModal.Mode = mode; break; case DeviceType.WXLock://微信锁 status = device.Value.StatusReceiver & 0x00FF; if (status == 1)//设备开 { if (hostModal.Status != 1)//设备有变化时才去更改状态 { flag = 1; hostModal.Status = 1; //sbSQL.Append("Status=1,"); //MemoryModal.Status = 1; } } else//设备关 { if (hostModal.Status != 2)//设备有变化时才去更改状态 { flag = 0; hostModal.Status = 2; //sbSQL.Append("Status=2,"); //MemoryModal.Status = 2; } } //更新主机主表 if (hostModal.Modal.Sort == 1)//.ModalAddress == "020001000") { if (host.LockStatus != status) { HostRepository.SetLockStatus(host, status); ; } } break; case DeviceType.ColorTemp://色温 #region 色温 status = device.Value.StatusReceiver & 0x00FF; brightness = device.Value.StatusReceiver >> 8;//亮度或者色温 if (status == 1)//设备开 { if (hostModal.Status != 1)//设备有变化时才去更改状态 { flag = 1; hostModal.Status = 1; hostModal.Brightness = brightness; //sbSQL.Append("Status=1,Brightness=100,"); //MemoryModal.Status = 1; //MemoryModal.Brightness = brightness; } } else//设备关 { if (status == 3) { flag = 1; hostModal.Status = 1; hostModal.AirConditionData.SettingTemp = brightness;//更新色温 //MemoryModal.Status = 1; //MemoryModal.SettingTemp = brightness; } else if (hostModal.Status != status)//设备有变化时才去更改状态,窗帘6是停,其他是关 { flag = 0; hostModal.Status = status; hostModal.Brightness = brightness; //sbSQL.Append("Status=" + status + ",Brightness=0,"); //MemoryModal.Status = status; //MemoryModal.Brightness = brightness; } } break; #endregion #endregion } #region 这里 CSRedisCacheHelper.Set_Partition(KKey, hostModal); //只有服务信息才会入库 bool isonly_serviceinfo = true; //if (hostModal.ModalType == DeviceType.ServiceInfo) if (isonly_serviceinfo) { HostModal FinallyData = new HostModal(); FinallyData.HostID = hostModal.HostID; FinallyData.Status = hostModal.Status; FinallyData.Brightness = hostModal.Brightness; FinallyData.CurrentTemp = hostModal.AirConditionData.CurrentTemp; FinallyData.FanSpeed = hostModal.AirConditionData.FanSpeed; FinallyData.Mode = hostModal.AirConditionData.Mode; FinallyData.SettingTemp = hostModal.AirConditionData.SettingTemp; FinallyData.UpdateTime = hostModal.UpdateTime; FinallyData.Valve = hostModal.AirConditionData.Valve; FinallyData.Modal = new RoomTypeModal() { ID = hostModal.Modal.ID, Name = hostModal.Modal.Name, ModalAddress = hostModal.Modal.ModalAddress, ActiveIndicator = hostModal.Modal.ActiveIndicator, Sort = hostModal.Modal.Sort }; FinallyData.Modal.RoomType = new RoomType() { ID = hostModal.Modal.RoomTypeID }; FinallyData.Modal.ID = hostModal.Modal.ID; FinallyData.UpdateTime = now; #region 有可能有异常 try { HostModalRecord hostModalRecord; switch (flag) { case 0://0关闭设备 if (hostModal.UpdateTime.HasValue) { hostModal.Time += Convert.ToInt32((now - hostModal.UpdateTime.Value).TotalMinutes); } hostModal.UpdateTime = now; FinallyData.UpdateTime = now; //阿宝添加内存 try { HostModalRepository.Update(FinallyData);//sbSQL.ToString()); } catch (Exception) { logger.Error(FinallyData.HostID + ":" + host.SysHotel.Code + " " + hostModal.Modal.ModalAddress); } //CSRedisCacheHelper.Set_Partition(KKey, hostModal); if (hostModal.Modal.ActiveIndicator)//处理回路状态记录,只记录启用的回路 add by wuzhuihui 20190918 { hostModalRecord = new HostModalRecord(); hostModalRecord.HostID = host.ID; hostModalRecord.RoomNumber = host.RoomNumber; hostModalRecord.RoomTypeID = host.RoomType.ID; hostModalRecord.RoomTypeModalID = hostModal.Modal.ID; hostModalRecord.ModalAddress = hostModal.Modal.ModalAddress; hostModalRecord.StartTime = now; hostModalRecord.Status = 2; try { HostModalRecordRepository.Save(hostModalRecord); } catch (Exception) { } } break; case 1://1打开设备且当前设备处于关闭状态 hostModal.UpdateTime = now; FinallyData.UpdateTime = now; //阿宝这里修改 try { HostModalRepository.Update(FinallyData);//sbSQL.ToString()); } catch (Exception ex) { logger.Error(FinallyData.HostID + ":" + host.SysHotel.Code + " " + hostModal.Modal.ModalAddress); } //CSRedisCacheHelper.Set_Partition(KKey, hostModal); if (hostModal.Modal.ActiveIndicator)//处理回路状态记录,只记录启用的回路 add by wuzhuihui 20190918 { hostModalRecord = new HostModalRecord(); hostModalRecord.HostID = host.ID; hostModalRecord.RoomNumber = host.RoomNumber; hostModalRecord.RoomTypeID = host.RoomType.ID; hostModalRecord.RoomTypeModalID = hostModal.Modal.ID; hostModalRecord.ModalAddress = hostModal.Modal.ModalAddress; hostModalRecord.StartTime = now; hostModalRecord.Status = 1; try { HostModalRecordRepository.Save(hostModalRecord); } catch (Exception) { } } break; case 2://2打开设备且当前设备处于打开状态 hostModal.UpdateTime = now; FinallyData.UpdateTime = now; try { HostModalRepository.Update(FinallyData); } catch (Exception ex) { logger.Error(FinallyData.HostID + ":" + host.SysHotel.Code + " " + hostModal.Modal.ModalAddress); } //CSRedisCacheHelper.Set_Partition(KKey, hostModal); break; } string StatusKey = "RoomStatus_ServerInfo"; RCUHost.RCUHostCommon.tools.LanJieData(StatusKey, HOTEL_CODE); CSRedisCacheHelper.Set_Partition(KKey, hostModal); } catch (Exception ex) { logger.Error("数据处理error: " + ex.Message); logger.Error(FinallyData.HostID + ":" + host.SysHotel.Code + " " + hostModal.Modal.ModalAddress); } #endregion } else { string StatusKey = "RoomStatus_NoWriteDb"; RCUHost.RCUHostCommon.tools.LanJieData(StatusKey, HOTEL_CODE); } #endregion #region 当设备或服务状态发生变化时,推送给指定的第三方接口 if ((flag == 0 || flag == 1) && (!string.IsNullOrEmpty(host.SysHotel.DeviceStatusPushURL))) { if (host.SysHotel.DeviceStatusPushURL.ToLower().IndexOf("wangjile") > -1)//freego过滤 { switch (hostModal.Modal.ModalAddress) { case "004000001"://取电 case "004000002"://勿扰 case "004000003"://清理 case "004000008"://sos break; default://其他不上报 continue; } } //阿宝修改的,下面 BUG,有多个设备上报的话,就会出问题 Tuple tup = new Tuple(host, hostModal); Task.Factory.StartNew((tupobj) => { Tuple ttt = tupobj as Tuple; XuanZhuResponse resp = new XuanZhuResponse(); resp.code = ttt.Item1.SysHotel.Code; resp.roomNumber = ttt.Item1.RoomNumber; resp.address = ttt.Item2.Modal.ModalAddress; resp.name = ttt.Item2.Modal.Name; resp.status = ttt.Item2.Status; if (resp.status == 1) { resp.brightness = ttt.Item2.Brightness; resp.currentTemp = ttt.Item2.AirConditionData.CurrentTemp; resp.settingTemp = ttt.Item2.AirConditionData.SettingTemp; resp.mode = ttt.Item2.AirConditionData.Mode; resp.fanSpeed = ttt.Item2.AirConditionData.FanSpeed; resp.valve = ttt.Item2.AirConditionData.Valve; } else { resp.brightness = 0; resp.currentTemp = 0; resp.settingTemp = 0; resp.mode = 0; resp.fanSpeed = 0; resp.valve = 0; } MyHttp.SendHttpData(ttt.Item1.SysHotel.DeviceStatusPushURL, resp); //string Key = "HttpRequest_" + resp.code + "_" + resp.roomNumber; //var Data = MemoryCacheHelper.Get(Key); //if (Data != null) //{ //} //else //{ // //XuanZhuOperation.ReportService(ttt.Item1.SysHotel.DeviceStatusPushURL, resp); //} }, tup); } #endregion } else { string NoKey = CacheKey.HostModalStatus_BoolFilterPrefix + "_" + host.ID + "_" + device.Value.Address; var expiredata = new Random().Next(10, 50); CSRedisCacheHelper.Set_PartitionWithTime(NoKey, 1, expiredata); //logger.Error("内存和数据库都不见这条数据:" + KKey); } #endregion } } StepTongJi.SendInfo(5, "Task中的设备处理代码执行完毕", ContextMessageId, ismonitor); devices.Clear(); } /// /// 是否在固定时段内禁用语音机器人 /// /// /// private static bool SmartRobotDisable(Host host) { if (string.IsNullOrEmpty(host.DisableStartTime) || string.IsNullOrEmpty(host.DisableEndTime)) { return false; } string et = host.DisableEndTime; string st = host.DisableStartTime; string[] st_a = st.Split(':'); string[] et_a = et.Split(':'); int h_st = int.Parse(st_a[0]); int M_st = int.Parse(st_a[1]); int h_et = int.Parse(et_a[0]); int M_et = int.Parse(et_a[1]); int y = DateTime.Now.Year; int m = DateTime.Now.Month; int d = DateTime.Now.Day; int hh = DateTime.Now.Hour; int mm = DateTime.Now.Minute; int ss = DateTime.Now.Second; var t1 = new DateTime(y, m, d, h_st, M_st, ss); var t2 = new DateTime(y, m, d, h_et, M_et, ss); bool ShiJian = false; //正常逻辑 if (t2 >= t1) { var ti = DateTime.Now; //如果当前时间大于 起 小于 至,就代表 确实是 禁用 if (ti >= t1 && ti <= t2) { ShiJian = true; } } else { var ti = DateTime.Now; var zero_ti = new DateTime(y, m, d, 23, 59, 59); var zero_ti_0 = new DateTime(y, m, d, 0, 0, 0); //var t3 = t2.AddDays(1); //如果当前时间 小于0点 //或者说 当前时间 大于 if ((ti > t1 && ti < zero_ti) || ti >= zero_ti_0 && ti <= t2) { ShiJian = true; } } bool dis = host.IsWelcomeDisableTime; return dis && ShiJian; } /// /// 碳达人发送数据 /// /// /// private static void CarbonDataSend(Host host, byte hhhg1) { string PropertyUUID = host.SysHotel.FCS_PropertyID; string FCS_RCU_Device_Offline = host.SysHotel.FCS_RCU_Device_Offline; string FCSLoginUrl = host.SysHotel.FCSLoginUrl; string FCSLoginUserName = host.SysHotel.FCSLoginUserName; string FCSLoginPassWord = host.SysHotel.FCSLoginPassWord; string FCS_Carbon_UUID = host.SysHotel.FCS_Carbon_UUID; string FCS_SOS_UUID = host.SysHotel.FCS_SOS_UUID; string FCS_Clean_UUID = host.SysHotel.FCS_Clean_UUID; string FCS_MenCi_Open = host.SysHotel.FCS_MenCi_Open; string FCS_MenCi_Close = host.SysHotel.FCS_MenCi_Close; string FCS_RCU_Online = host.SysHotel.FCS_RCU_Online; string FCS_RCU_Offline = host.SysHotel.FCS_RCU_Offline; RR.FCS_PushData(FCS_Carbon_UUID, host.FCS_locationUUID, PropertyUUID, FCSLoginUrl, FCSLoginUserName, FCSLoginPassWord, host.SysHotel.Code, host.RoomNumber); if (!string.IsNullOrEmpty(host.SysHotel.DeviceStatusPushURL)) { Tuple tup = new Tuple(host, hhhg1); Task.Factory.StartNew((tupobj) => { Tuple ttt = tupobj as Tuple; XuanZhuResponse resp = new XuanZhuResponse(); resp.code = ttt.Item1.SysHotel.Code; resp.roomNumber = ttt.Item1.RoomNumber; resp.address = "054000001"; resp.name = "碳达人"; resp.status = ttt.Item2; //string mns = Newtonsoft.Json.JsonConvert.SerializeObject(resp); //CSRedisCacheHelper.Publish("redis-carbon_trigger", mns); MyHttp.SendHttpData(ttt.Item1.SysHotel.DeviceStatusPushURL, resp); //XuanZhuOperation.ReportService(ttt.Item1.SysHotel.DeviceStatusPushURL, resp); }, tup); } } /// /// 处理故障(温控器掉线) /// /// /// private void ProcessFaults(Host host, ConcurrentDictionary faults) { string HotelCode = host.SysHotel.Code; string PropertyUUID = host.SysHotel.FCS_PropertyID; string FCS_RCU_Device_Offline = host.SysHotel.FCS_RCU_Device_Offline; string FCSLoginUrl = host.SysHotel.FCSLoginUrl; string FCSLoginUserName = host.SysHotel.FCSLoginUserName; string FCSLoginPassWord = host.SysHotel.FCSLoginPassWord; string FCS_Carbon_UUID = host.SysHotel.FCS_Carbon_UUID; string FCS_SOS_UUID = host.SysHotel.FCS_SOS_UUID; string FCS_Clean_UUID = host.SysHotel.FCS_Clean_UUID; string FCS_MenCi_Open = host.SysHotel.FCS_MenCi_Open; string FCS_MenCi_Close = host.SysHotel.FCS_MenCi_Close; string FCS_RCU_Online = host.SysHotel.FCS_RCU_Online; string FCS_RCU_Offline = host.SysHotel.FCS_RCU_Offline; DateTime now = DateTime.Now; bool isInsert = false; //StringBuilder sbSQL; foreach (var fault in faults) { var hostModal = HostModalRepository.Get(host.ID, fault.Value.FaultNo); if (hostModal == null || (fault.Value.Type == 1 && !hostModal.Modal.OfflineDisplay) || (fault.Value.Type == 2 && !hostModal.Modal.LowPowerDisplay) || hostModal.Modal.Abnormal == false) { continue;//回路不存在,或离线不显示,或低电不显示,则不保存 add by jophywu on 20191102 } var record = HostFaultsRepository.Get(host.ID, fault.Value.FaultNo); //sbSQL = new StringBuilder(); //sbSQL.Append("UPDATE tb_HostFaults SET "); if (record == null) { isInsert = true; record = new HostFaults(); record.HostID = host.ID; record.Address = fault.Value.FaultNo; record.AbnormalStatus = 0;//默认在线 record.StatusDate = Convert.ToDateTime("1800-1-1"); record.AbnormalElectricQty = 100;//默认电量100 record.ElectricQtyDate = Convert.ToDateTime("1800-1-1"); record.Abnormal3 = 0;//默认电流100 record.Abnormal3Date = Convert.ToDateTime("1800-1-1"); record.Abnormal4 = 0;//1901故障检测次数,默认0 record.Abnormal4Date = Convert.ToDateTime("1800-1-1"); record.Abnormal5 = 0;//设备单个回路状态:0正常,1损坏 record.Abnormal5Date = Convert.ToDateTime("1800-1-1"); } switch (fault.Value.Type) { case 1://状态:1离线,0在线 record.AbnormalStatus = fault.Value.Data; record.StatusDate = now; RR.FCS_PushData(FCS_RCU_Device_Offline, host.FCS_locationUUID, PropertyUUID, FCSLoginUrl, FCSLoginUserName, FCSLoginPassWord, host.SysHotel.Code, host.RoomNumber); //sbSQL.Append("AbnormalStatus=" + record.AbnormalStatus + ",StatusDate=GETDATE()"); break; case 2://电量 record.AbnormalElectricQty = fault.Value.Data; record.ElectricQtyDate = now; //sbSQL.Append("AbnormalElectricQty=" + record.AbnormalElectricQty + ",ElectricQtyDate=GETDATE()"); break; case 3://电流(10MA) record.Abnormal3 = fault.Value.Data; record.Abnormal3Date = now; //sbSQL.Append("Abnormal3=" + record.Abnormal3 + ",Abnormal3Date=GETDATE()"); break; case 4://1901故障检测次数 record.Abnormal4 = fault.Value.Data; record.Abnormal4Date = now; //sbSQL.Append("Abnormal4=" + record.Abnormal4 + ",Abnormal4Date=GETDATE()"); break; case 5://设备单个回路状态:0正常,1损坏 record.Abnormal5 = fault.Value.Data; record.Abnormal5Date = now; //sbSQL.Append("Abnormal5=" + record.Abnormal5 + ",Abnormal5Date=GETDATE()"); break; default: continue;//不保存 } if (isInsert) { isInsert = false; HostFaultsRepository.Save(record); } else { //sbSQL.Append(" WHERE ID=" + record.ID); HostFaultsRepository.Update(record);//sbSQL.ToString()); } //保存每一次异常记录 HostFaultRecords hostFaultRecords = new HostFaultRecords(); hostFaultRecords.HostID = host.ID; hostFaultRecords.RoomNumber = host.RoomNumber; hostFaultRecords.RoomTypeID = hostModal.Modal.RoomType.ID; hostFaultRecords.RoomTypeModalID = hostModal.Modal.ID; hostFaultRecords.ModalAddress = hostModal.Modal.ModalAddress; hostFaultRecords.Type = fault.Value.Type; hostFaultRecords.Value = fault.Value.Data; hostFaultRecords.Date = now; HostFaultRecordsRepository.Save(hostFaultRecords); XuanZhuResponse resp1 = new XuanZhuResponse() { code = host.SysHotel.Code, roomNumber = host.RoomNumber, address = hostModal.Modal.ModalAddress, name = hostModal.Modal.Name, status = hostModal.Status, faultType = fault.Value.Type, faultData = fault.Value.Data }; string KKK = CacheKey.WebChatDeviceFault + "_" + resp1.code + "_" + resp1.roomNumber; CSRedisCacheHelper.redis_webchat.HMSet(KKK, resp1.address, resp1); //出现异常信息时上报 if (!string.IsNullOrEmpty(host.SysHotel.FaultPushURL)) { XuanZhuResponse resp = new XuanZhuResponse() { code = host.SysHotel.Code, roomNumber = host.RoomNumber, address = hostModal.Modal.ModalAddress, name = hostModal.Modal.Name, status = hostModal.Status, faultType = fault.Value.Type, faultData = fault.Value.Data }; //var u = Newtonsoft.Json.JsonConvert.SerializeObject(resp); //logger.Error("logger report fault: "+u); var fault_data = new Tuple(host.SysHotel.FaultPushURL, resp); Task.Factory.StartNew((State) => { var DDD = State as Tuple; string Res_P = MyHttp.SendHttpData(DDD.Item1, DDD.Item1); //XuanZhuOperation.ReportService(DDD.Item1, DDD.Item2); logger.Error("Fault Return:" + ""); }, fault_data); } } faults.Clear(); } /// /// 暂时用不到 /// /// /// private void ProcessFaults_NEW(SomeDeviceExistsData host, ConcurrentDictionary faults) { DateTime now = DateTime.Now; bool isInsert = false; //StringBuilder sbSQL; foreach (var fault in faults) { var hostModal = HostModalRepository.Get(host.HostID, fault.Value.FaultNo); if (hostModal == null || (fault.Value.Type == 1 && !hostModal.Modal.OfflineDisplay) || (fault.Value.Type == 2 && !hostModal.Modal.LowPowerDisplay)) { continue;//回路不存在,或离线不显示,或低电不显示,则不保存 add by jophywu on 20191102 } var record = HostFaultsRepository.Get(host.HostID, fault.Value.FaultNo); //sbSQL = new StringBuilder(); //sbSQL.Append("UPDATE tb_HostFaults SET "); if (record == null) { isInsert = true; record = new HostFaults(); record.HostID = host.HostID; record.Address = fault.Value.FaultNo; record.AbnormalStatus = 0;//默认在线 record.StatusDate = Convert.ToDateTime("1800-1-1"); record.AbnormalElectricQty = 100;//默认电量100 record.ElectricQtyDate = Convert.ToDateTime("1800-1-1"); record.Abnormal3 = 0;//默认电流100 record.Abnormal3Date = Convert.ToDateTime("1800-1-1"); record.Abnormal4 = 0;//1901故障检测次数,默认0 record.Abnormal4Date = Convert.ToDateTime("1800-1-1"); record.Abnormal5 = 0;//设备单个回路状态:0正常,1损坏 record.Abnormal5Date = Convert.ToDateTime("1800-1-1"); } switch (fault.Value.Type) { case 1://状态:1离线,0在线 record.AbnormalStatus = fault.Value.Data; record.StatusDate = now; //sbSQL.Append("AbnormalStatus=" + record.AbnormalStatus + ",StatusDate=GETDATE()"); break; case 2://电量 record.AbnormalElectricQty = fault.Value.Data; record.ElectricQtyDate = now; //sbSQL.Append("AbnormalElectricQty=" + record.AbnormalElectricQty + ",ElectricQtyDate=GETDATE()"); break; case 3://电流(10MA) record.Abnormal3 = fault.Value.Data; record.Abnormal3Date = now; //sbSQL.Append("Abnormal3=" + record.Abnormal3 + ",Abnormal3Date=GETDATE()"); break; case 4://1901故障检测次数 record.Abnormal4 = fault.Value.Data; record.Abnormal4Date = now; //sbSQL.Append("Abnormal4=" + record.Abnormal4 + ",Abnormal4Date=GETDATE()"); break; case 5://设备单个回路状态:0正常,1损坏 record.Abnormal5 = fault.Value.Data; record.Abnormal5Date = now; //sbSQL.Append("Abnormal5=" + record.Abnormal5 + ",Abnormal5Date=GETDATE()"); break; default: continue;//不保存 } if (isInsert) { isInsert = false; HostFaultsRepository.Save(record); } else { //sbSQL.Append(" WHERE ID=" + record.ID); HostFaultsRepository.Update(record);//sbSQL.ToString()); } //保存每一次异常记录 HostFaultRecords hostFaultRecords = new HostFaultRecords(); hostFaultRecords.HostID = host.HostID; hostFaultRecords.RoomNumber = host.RoomNumber; hostFaultRecords.RoomTypeID = hostModal.Modal.RoomType.ID; hostFaultRecords.RoomTypeModalID = hostModal.Modal.ID; hostFaultRecords.ModalAddress = hostModal.Modal.ModalAddress; hostFaultRecords.Type = fault.Value.Type; hostFaultRecords.Value = fault.Value.Data; hostFaultRecords.Date = now; HostFaultRecordsRepository.Save(hostFaultRecords); //出现异常信息时上报 if (!string.IsNullOrEmpty(host.FaultPushURL)) { Task.Factory.StartNew(() => { XuanZhuResponse resp = new XuanZhuResponse() { code = host.HotelCode, roomNumber = host.RoomNumber, address = hostModal.Modal.ModalAddress, name = hostModal.Modal.Name, status = hostModal.Status, faultType = fault.Value.Type, faultData = fault.Value.Data }; //XuanZhuOperation.ReportService(host.FaultPushURL, resp); MyHttp.SendHttpData(host.FaultPushURL, resp); }); } } //faults.Clear(); } public override CommandType CommandType { get { return CommandType.RoomStatus; } } private byte[] CreateRoomStatusRequestPacket() { SystemHeader systemHeader = CreateSystemHeader(); int size = StructConverter.SizeOf(systemHeader) + 2; systemHeader.FrameLength = (ushort)size; byte[] buffer = new byte[size]; byte[] data1 = StructConverter.StructToBytes(systemHeader); Array.Copy(data1, 0, buffer, 0, data1.Length); return buffer; } /// /// 解释上报命令 /// /// /// /// private Status DecodeRoomStatus(Host host, Stream stream) { Status roomStatus = new Status(); try { using (BinaryReader reader = new BinaryReader(stream)) { roomStatus.SysLock = reader.ReadBoolean(); //RCU是否锁定:0/否,1/是 roomStatus.CardType = reader.ReadByte(); //房卡类型:0/无人,1/有人,2/客人,3/经理,4/服务员 roomStatus.Door = reader.ReadBoolean(); //门磁开关:1/开,2/关 roomStatus.ElecQty = reader.ReadUInt16(); //门锁电量,单位:MV roomStatus.HostTemp = reader.ReadByte(); //主机温度 //空调数量,默认0,新的回路方式,此处无用,兼容老版本 int airConditionNumber = reader.ReadByte(); for (int i = 0; i < airConditionNumber; i++) { byte airNo = reader.ReadByte(); if (!roomStatus.AirConditions.ContainsKey(airNo)) { roomStatus.AirConditions[airNo] = new AirConditionStatus(); } roomStatus.AirConditions[airNo].AirNo = airNo; roomStatus.AirConditions[airNo].CurrentTemp = reader.ReadSByte(); roomStatus.AirConditions[airNo].SettingTemp = reader.ReadSByte(); roomStatus.AirConditions[airNo].OnOff = reader.ReadBoolean(); roomStatus.AirConditions[airNo].Speed = reader.ReadByte(); roomStatus.AirConditions[airNo].Mode = reader.ReadByte(); roomStatus.AirConditions[airNo].Valve = reader.ReadByte(); roomStatus.AirConditions[airNo].CompensatoryTemp = ConvertCompensatoryTempToServer(reader.ReadByte()); roomStatus.AirConditions[airNo].KeepTemp = reader.ReadByte(); roomStatus.AirConditions[airNo].ColdHotMode = reader.ReadByte(); roomStatus.AirConditions[airNo].DeadTemp = reader.ReadByte(); roomStatus.AirConditions[airNo].HotDevition = reader.ReadByte(); roomStatus.AirConditions[airNo].ColdDevition = reader.ReadByte(); } //设备状态数量,包含所有回路状态 int deviceNumber = reader.ReadByte(); for (int i = 0; i < deviceNumber; i++) { var QA = reader.ReadBytes(4); var Status = reader.ReadUInt16(); string address = new DeviceAddress(QA).ToString(); if (!roomStatus.Devices.ContainsKey(address)) { roomStatus.Devices[address] = new Device(); } roomStatus.Devices[address].Address = address;//设备地址 roomStatus.Devices[address].StatusReceiver = Status;//设备状态改为2个字节,Modified By 20181213 } //故障数量,默认0 int faultNumber = reader.ReadByte(); for (int i = 0; i < faultNumber; i++) { string faultNo = new DeviceAddress(reader.ReadBytes(4)).ToString();//设备类型1、设备地址1、回路地址2 byte type = reader.ReadByte(); if (!roomStatus.Faults.ContainsKey(faultNo + type.ToString())) { roomStatus.Faults[faultNo + type.ToString()] = new FaultStaus(); } roomStatus.Faults[faultNo + type.ToString()].FaultNo = faultNo; roomStatus.Faults[faultNo + type.ToString()].Type = type;//类型:1在线状态(0在线,1离线),2电量(0~100%),3电流,4 1901故障检测次数 roomStatus.Faults[faultNo + type.ToString()].Data = reader.ReadByte();//内容 } return roomStatus; } } catch (Exception) { return null; } } public static string[] NoFilterHotelCode = new string[] { "1001","1085" ,"1197","2079" }; private Status DecodeRoomStatus_NEW(Stream stream, string HostNumberOnly, out bool TakeCardTriggerWelcome, string hotelcode, string roomnum) { TakeCardTriggerWelcome = true; Status roomStatus = new Status(); try { // 重要:将流的位置重置到开始,以便读取 //stream.Seek(0, SeekOrigin.Begin); using (BinaryReader reader = new BinaryReader(stream)) { roomStatus.SysLock = reader.ReadBoolean(); //RCU是否锁定:0/否,1/是 roomStatus.CardType = reader.ReadByte(); //房卡类型:0/无人,1/有人,2/客人,3/经理,4/服务员 roomStatus.Door = reader.ReadBoolean(); //门磁开关:1/开,2/关 roomStatus.ElecQty = reader.ReadUInt16(); //门锁电量,单位:MV roomStatus.HostTemp = reader.ReadByte(); //主机温度 //空调数量,默认0,新的回路方式,此处无用,兼容老版本 int airConditionNumber = reader.ReadByte(); for (int i = 0; i < airConditionNumber; i++) { byte airNo = reader.ReadByte(); if (!roomStatus.AirConditions.ContainsKey(airNo)) { roomStatus.AirConditions[airNo] = new AirConditionStatus(); } roomStatus.AirConditions[airNo].AirNo = airNo; roomStatus.AirConditions[airNo].CurrentTemp = reader.ReadSByte(); roomStatus.AirConditions[airNo].SettingTemp = reader.ReadSByte(); roomStatus.AirConditions[airNo].OnOff = reader.ReadBoolean(); roomStatus.AirConditions[airNo].Speed = reader.ReadByte(); roomStatus.AirConditions[airNo].Mode = reader.ReadByte(); roomStatus.AirConditions[airNo].Valve = reader.ReadByte(); roomStatus.AirConditions[airNo].CompensatoryTemp = ConvertCompensatoryTempToServer(reader.ReadByte()); roomStatus.AirConditions[airNo].KeepTemp = reader.ReadByte(); roomStatus.AirConditions[airNo].ColdHotMode = reader.ReadByte(); roomStatus.AirConditions[airNo].DeadTemp = reader.ReadByte(); roomStatus.AirConditions[airNo].HotDevition = reader.ReadByte(); roomStatus.AirConditions[airNo].ColdDevition = reader.ReadByte(); } //设备状态数量,包含所有回路状态 int deviceNumber = reader.ReadByte(); //青奥酒店的数据是对的,包含在19中 if (!NoFilterHotelCode.Contains(hotelcode)) //if (!hotelcode.Equals("1001")) { if (deviceNumber == 25) { //Device dd = null; //roomStatus.Devices.TryRemove("004000001", out dd); string key123 = PoolOverFlowKey + "_" + HostNumberOnly; //MemoryCacheHelper.Set(key123, 0, DateTimeOffset.Now.AddSeconds(5)); MemoryCacheHelper.SlideSet(key123, 0, new TimeSpan(0, 0, 5)); return null; } } long originalPosition = reader.BaseStream.Position; // 读取前先记录当前位置 try { //0x19数据缓冲区异常问题处理 //0x19 取电数据不处理 //非0x19 取电数据处理,但是不触发 欢迎词 ushort UUUS = 0; for (int i = 0; i < deviceNumber; i++) { var QA = reader.ReadBytes(4); var Status = reader.ReadUInt16(); string address = new DeviceAddress(QA).ToString(); if (!roomStatus.Devices.ContainsKey(address)) { roomStatus.Devices[address] = new Device(); } roomStatus.Devices[address].Address = address;//设备地址 roomStatus.Devices[address].StatusReceiver = Status;//设备状态改为2个字节,Modified By 20181213 originalPosition = reader.BaseStream.Position; UUUS = Status; } if (roomStatus.Devices.All(A => A.Key.StartsWith("004000"))) { //这个是定期上报,触发数据读写,但是不触发欢迎词 if (deviceNumber == 5 || deviceNumber == 6) { TakeCardTriggerWelcome = false; } } } catch (Exception) { // 发生异常时回退到原始位置 reader.BaseStream.Position = originalPosition; //logger.Error("device_count error"); } try { //故障数量,默认0 int faultNumber = reader.ReadByte(); for (int i = 0; i < faultNumber; i++) { string faultNo = new DeviceAddress(reader.ReadBytes(4)).ToString();//设备类型1、设备地址1、回路地址2 byte type = reader.ReadByte(); if (!roomStatus.Faults.ContainsKey(faultNo + type.ToString())) { roomStatus.Faults[faultNo + type.ToString()] = new FaultStaus(); } roomStatus.Faults[faultNo + type.ToString()].FaultNo = faultNo; roomStatus.Faults[faultNo + type.ToString()].Type = type;//类型:1在线状态(0在线,1离线),2电量(0~100%),3电流,4 1901故障检测次数 roomStatus.Faults[faultNo + type.ToString()].Data = reader.ReadByte();//内容 } } catch (Exception) { } return roomStatus; } } catch (Exception) { return null; } } /// /// 将补偿温度转换为服务器存储格式,具体格式参见协议 /// /// /// private float ConvertCompensatoryTempToServer(byte temp) { float val = Convert.ToSingle((temp & 0x7F) / 10.0); if ((temp & 0x80) != 0) { return -val; } return val; } } public class Status { /// /// RCU是否锁定 /// public bool SysLock { get; set; } /// /// 房卡类型 /// public byte CardType { get; set; } /// /// 房门开关 /// public bool Door { get; set; } /// /// 电量 /// public ushort ElecQty { get; set; } /// /// 主机温度 /// public byte HostTemp { get; set; } /// /// 空调状态 /// public ConcurrentDictionary AirConditions = new ConcurrentDictionary(); /// /// 设备状态 /// public ConcurrentDictionary Devices = new ConcurrentDictionary(); /// /// 故障列表 /// public ConcurrentDictionary Faults = new ConcurrentDictionary(); } /// /// 空调状态 /// public class AirConditionStatus { /// /// 空调号 /// public byte AirNo { get; set; } /// /// 当前温度 /// public int CurrentTemp { get; set; } /// /// 设定温度 /// public int SettingTemp { get; set; } /// /// 风机开关 /// public bool OnOff { get; set; } /// /// 风速:0/停止, 1/低速, 2/中速, 3/高速, 4/自动 /// public int Speed { get; set; } /// /// 模式: 0/制冷,1/制热,2/送风,3/除湿 /// public int Mode { get; set; } /// /// 阀状态: 1/阀开,2/阀关 /// public int Valve { get; set; } /// /// 补偿温度,范围-6.0~6.0 /// public float CompensatoryTemp { get; set; } /// /// 保温温度 /// public int KeepTemp { get; set; } /// /// 冷热模式:0/手动,1/自动 /// public int ColdHotMode { get; set; } /// /// 死区温度 /// public int DeadTemp { get; set; } /// /// 热偏差 /// public int HotDevition { get; set; } /// /// 冷偏差 /// public int ColdDevition { get; set; } } public class FaultStaus { /// /// 故障号 /// public string FaultNo { get; set; } /// /// 类型:1在线状态(0在线,1离线),2电量(0~100%),3电流,4 1901故障检测次数,5设备单个回路状态(0正常,1损坏) /// public byte Type { get; set; } /// /// 内容 /// public byte Data { get; set; } } }