using System; using System.Collections.Generic; using System.Collections.Concurrent; using System.Data; using System.Linq; using System.Linq.Dynamic; using System.Text; using System.Threading.Tasks; using Dao; using Domain; using RCUHost; using System.Xml; using Common; using System.IO; using Dao.Implement; using RestSharp; using CommonEntity; using System.Configuration; namespace Service.Implement { public class HostManager : GenericManagerBase, IHostManager { #region Properties private static log4net.ILog logger = log4net.LogManager.GetLogger(typeof(HostManager)); public IUpdateHostReceiver UpdateHostReceiver { get; set; } public IUpdateHostFTPReceiver UpdateHostFTPReceiver { get; set; } public IUpdateRCUFileReceiver UpdateRCUFileReceiver { get; set; } public IAuthorizationReceiver AuthorizationReceiver { get; set; } //public IUpdateConfigReceiver UpdateConfigReceiver { get; set; } //public IConnectingRoomReceiver ConnectingRoomReceiver { get; set; } //public IHeartReceiver HeartReceiver { get; set; } //public IRoomTypeRepository RoomTypeRepository { get; set; } public IAlarmSettingRepository AlarmSettingRepository { get; set; } public IGroupRepository GroupRepository { get; set; } public IRoomTypeModalRepository RoomTypeModalRepository { get; set; } public IRoomTypeAirRepository RoomTypeAirRepository { get; set; } public IHostAirRepository HostAirRepository { get; set; } public IHostModalRepository HostModalRepository { get; set; } public INetworkSettingReceiver NetworkSettingReceiver { get; set; } public IRoomStatusRepository RoomStatusRepository { get; set; } public IRoomStatusChangedReceiver RoomStatusChangedReceiver { get; set; } public IRoomServiceRepository RoomServiceRepository { get; set; } public ISysHotelRepository SysHotelRepository { get; set; } public IDeviceSecretReceiver DeviceSecretReceiver { get; set; } public IHostSecretReceiver HostSecretReceiver { get; set; } public IHostWordsReportRepository HostWordsReportRepository { get; set; } public IHostFaultsRepository HostFaultsRepository { get; set; } public IHostFaultRecordsRepository HostFaultRecordsRepository { get; set; } public IHostSceneRepository HostSceneRepository { get; set; } public IHostRoomCardRepository HostRoomCardRepository { get; set; } public IHostRegisterReceiver HostRegisterReceiver { get; set; } public IHostRegisterSetReceiver HostRegisterSetReceiver { get; set; } public ISysOauth2Repository SysOauth2Repository { get; set; } public IHotelSeasonRepository HotelSeasonRepository { get; set; } public IHotelAirControlRepository HotelAirControlRepository { get; set; } public IHostModalManager HostModalManager { get; set; } public IHostRepository HostRepository { get; set; } /// /// 阿宝添加的功能 /// public IKongTiaoTimerManager KongTiaoManager { get; set; } public IRoomNoBodyMananger RoomNoBodyMananger { get; set; } public IRoomNoBodyLogMananger RoomNoBodyLogMananger { get; set; } public IECO_DetailRepository ECO_DetailRepository { get; set; } public IECO_SettingRepository ECO_SettingRepository { get; set; } public IT_FTPReceiver TFTP_LogReceiver { get; set; } public IT_FTPSettingReceiver TFTP_LogSettingReceiver { get; set; } /// /// 透传功能 /// public IHostTouChuan HostUDPTouChuan { get; set; } #endregion //private bool GetHostStatus(string hostNumber) //{ // return Common.MemoryCacheHelper.Contains(hostNumber); //} #region Public Methods public override Host Get(object id) { var host = base.Get(id); if (host != null) { host.Status = Common.CSRedisCacheHelper.Contains(host.HostNumber, host.MAC); } return host; } public override IList LoadAll() { IList list = base.LoadAll(); foreach (var host in list) { host.Status = Common.CSRedisCacheHelper.Contains(host.HostNumber, host.MAC); } return list; } public IList LoadAll(string order, string sort, Group group, string roomNumber) { IList groups = GroupRepository.GetGroupList(group); IList hosts = ((IHostRepository)CurrentRepository).LoadAll(order, sort, groups, roomNumber); foreach (var host in hosts) { host.Status = Common.CSRedisCacheHelper.Contains(host.HostNumber, host.MAC); var table = RoomServiceRepository.LoadAll().Where(r => r.HostID == host.ID && r.AlarmType == 'B').ToList(); //foreach (var roomService in table) //{ // if (roomService.AlarmCode == "B01") // { // host.SOS = roomService.Status; // } // else if (roomService.AlarmCode == "B02") // { // host.RequestDNDST = roomService.Status; // } // else if (roomService.AlarmCode == "B03") // { // host.RequestClear = roomService.Status; // } // else if (roomService.AlarmCode == "B04") // { // host.RequestService = roomService.Status; // } // else if (roomService.AlarmCode == "B05") // { // host.RequestCheckOut = roomService.Status; // } //} } return hosts; } public IList LoadAll(Group group) { IList groups = GroupRepository.GetGroupList(group); IList hosts = ((IHostRepository)CurrentRepository).LoadAll(groups); foreach (var host in hosts) { host.Status = Common.CSRedisCacheHelper.Contains(host.HostNumber, host.MAC); } return hosts; } public IList LoadAll(string hotelCode) { var hotel = SysHotelRepository.GetByCode(hotelCode); return ((IHostRepository)CurrentRepository).LoadAll(hotel.ID, ""); } public IList LoadAll(int hotelID, string roomNumber = "") { IList hosts = ((IHostRepository)CurrentRepository).LoadAll(hotelID, roomNumber); foreach (var host in hosts) { host.Status = Common.CSRedisCacheHelper.Contains(host.HostNumber, host.MAC); } return hosts; } public IList LoadAll(IList groupList, RoomStatus roomStatus, RoomType roomType) { var hostList = ((IHostRepository)CurrentRepository).LoadAll(groupList, roomStatus, roomType); foreach (var host in hostList) { host.Status = Common.CSRedisCacheHelper.Contains(host.HostNumber, host.MAC); } return hostList; } public IList LoadAllByPage(out long total, int page, int rows, string order, string sort, int groupId, int hotelID, string roomNumber, string mac, string roomType, int isSyncRoomNumber) { return ((IHostRepository)CurrentRepository).LoadAllByPage(out total, page, rows, order, sort, groupId, hotelID, roomNumber, mac, roomType, isSyncRoomNumber).ToList(); //var list = CurrentRepository.LoadAll(); //if (groupId.HasValue && groupId != 1) //{ // list = list.Where(r => r.Group != null && r.Group.ID == groupId); //} //total = list.LongCount(); //list = list.OrderBy(sort + " " + order); //list = list.Skip((page - 1) * rows).Take(rows); //return list.ToList(); } public DataTable LoadHostWithPage(out long total, int page, int rows, string order, string sort, int groupId, int hotelID, string roomNumber, string mac, string roomType) { return ((IHostRepository)CurrentRepository).LoadHostWithPage(out total, page, rows, order, sort, groupId, hotelID, roomNumber, mac, roomType); } public IList LoadRooms(out long total, int page, int rows, int? groupId, int lang, int hotelID) { return ((IHostRepository)CurrentRepository).LoadRooms(out total, page, rows, groupId, lang, hotelID); } public IList LoadRoomNumbers() { return ((IHostRepository)CurrentRepository).LoadAll().Select(r => r.RoomNumber).ToList(); } public DataTable LoadRoomNumbers(Group group, int hotelID) { return ((IHostRepository)CurrentRepository).LoadRoomNumbers(group, hotelID); } public override object Save(Host entity) { try { //SysHotel sysHotel = SysHotelRepository.Get(entity.SysHotel.ID); //if (sysHotel == null) { throw new ApplicationException("无效的酒店!"); } //RoomType roomType = RoomTypeRepository.Get(entity.RoomType.ID); //if (roomType == null) { throw new ApplicationException("无效的房型!"); } if (entity.ID == 0)//新增 { entity.RegisterDate = DateTime.Now; entity.RoomStatus = new RoomStatus { ID = 16 }; entity.SafeStatus = 2; entity.Version = "C";//界面上新增的主机都属于C系列主机 entity.ExpireTime = Convert.ToDateTime("2100-12-31");//默认有效期永久 entity.Last_Modified_Time = DateTime.Now;//标识有更新 base.Save(entity); Task.Factory.StartNew((state) => { var entity1 = state as Host; UpdateHostModals(entity1); }, entity); //更新回路 return entity; } else { var host = CurrentRepository.Get(entity.ID); Host host_take = null; string Key = CacheKey.HostInfo_Key_HostNumber + "_" + host.HostNumber; object obj = MemoryCacheHelper.Get(Key); if (obj != null) { host_take = obj as Host; } int oldRoomTypeID = host.RoomType.ID; bool isChanged = false; if (host.RoomNumber != entity.RoomNumber) { host.RoomNumber = entity.RoomNumber; isChanged = true; } if (host.MAC != entity.MAC) { host.MAC = entity.MAC; isChanged = true; } if (host.SysHotel.ID != entity.SysHotel.ID) { host.SysHotel = entity.SysHotel; isChanged = true; } if (host.RoomType.ID != entity.RoomType.ID) { host.RoomType = entity.RoomType; isChanged = true; } if (host.Remark != entity.Remark.Trim()) { host.Remark = entity.Remark.Trim(); isChanged = true; } if (host.ServerIP != entity.ServerIP.Trim()) { host.ServerIP = entity.ServerIP.Trim(); isChanged = true; } if (host.ServerPort != entity.ServerPort) { host.ServerPort = entity.ServerPort; isChanged = true; } if (host.FCS_locationUUID != entity.FCS_locationUUID) { host.FCS_locationUUID = entity.FCS_locationUUID; isChanged = true; } if (isChanged) { host.Last_Modified_Time = DateTime.Now; } host.HostNumber = entity.HostNumber; host.Group = entity.Group; if (string.IsNullOrEmpty(host.Version)) { host.Version = "C"; } host.IsSyncRoomNumber = entity.IsSyncRoomNumber; host.IsAutoUpdate = entity.IsAutoUpdate; host.IPType = entity.IPType; if (host.IPType == 2) { host.LanIP = entity.LanIP.Trim(); host.LanPort = entity.LanPort; host.SubnetMask = entity.SubnetMask.Trim(); host.Gateway = entity.Gateway.Trim(); host.DNS = entity.DNS.Trim(); } base.Update(host); if (host_take != null) { host_take.ServerPort = host.ServerPort; host_take.ServerIP = host.ServerIP; host_take.FCS_locationUUID = host.FCS_locationUUID; host.RoomType = host.RoomType; host_take.MAC = host.MAC; host_take.Version = host.Version; host_take.LanIP = host.LanIP; host_take.LanPort = host.LanPort; host_take.SubnetMask = host.SubnetMask; host_take.Gateway = host.Gateway; host_take.DNS = host.DNS; } if (HostModalRepository.LoadByHostID(entity.ID).ToList().Count == 0 || host.RoomType == null || host.RoomType.ID != oldRoomTypeID) { Task.Factory.StartNew((state) => { var entity1 = state as Host; UpdateHostModals(entity1); }, entity);//更新回路 } return host; } } catch (Exception ex) { throw new ApplicationException(ex.ToString()); } } public void SaveSmartVoiceBinding(Host entity) { var host = CurrentRepository.Get(entity.ID); host.XiaoDuCUID = entity.XiaoDuCUID; host.TCLCUID = entity.TCLCUID; host.TCLSkillID = entity.TCLSkillID; host.HuaWeiCUID = entity.HuaWeiCUID; host.TianMaoCUID = entity.TianMaoCUID; host.HiWeiCUID = entity.HiWeiCUID; host.RokidWebhookUrl = entity.RokidWebhookUrl; host.IsWelcomeDisableTime = entity.IsWelcomeDisableTime; host.DisableStartTime = entity.DisableStartTime; host.DisableEndTime = entity.DisableEndTime; //string Key = CacheKey.HostInfo_Key_HostNumber + "_" + host.HostNumber; //object obj = MemoryCacheHelper.Get(Key); //if (obj != null) //{ // host = obj as Host; // host.XiaoDuCUID; //} ((IHostRepository)CurrentRepository).Update(host); } public Host GetByMAC(string mac, int hotelID) { return (CurrentRepository as Dao.IHostRepository).GetByMAC(mac, hotelID); } public IList LoadByMac(string mac) { return (CurrentRepository as Dao.IHostRepository).LoadByMac(mac); } public Host GetByXiaoDuCUID(string cuid) { return (CurrentRepository as Dao.IHostRepository).GetByXiaoDuCUID(cuid); } public Host GetByTianMaoCUID(string cuid) { return (CurrentRepository as Dao.IHostRepository).GetByTianMaoCUID(cuid); } public Host GetByHuaWeiCUID(string cuid) { return (CurrentRepository as Dao.IHostRepository).GetByHuaWeiCUID(cuid); } public Host GetByTCLCUID(string cuid) { return (CurrentRepository as Dao.IHostRepository).GetByTCLCUID(cuid); } public Host GetByRoomNumber(string roomNumber, int hotelID) { if (String.IsNullOrEmpty(roomNumber)) { return null; } return CurrentRepository.LoadAll().FirstOrDefault(r => r.RoomNumber == roomNumber && r.SysHotel.ID == hotelID && !r.IsDeleted); } public Host GetByRoomNumber(string roomNumber, string hotelCode) { if (String.IsNullOrEmpty(roomNumber)) { return null; } return CurrentRepository.LoadAll().FirstOrDefault(r => r.RoomNumber == roomNumber && r.SysHotel.Code == hotelCode && !r.IsDeleted); } public Host GetByRoomNumberSupply(string roomNumber) { if (String.IsNullOrEmpty(roomNumber)) { return null; } return CurrentRepository.LoadAll().FirstOrDefault(r => r.RoomNumber == roomNumber && !r.IsDeleted); } //public IList GetConnectRoomHosts(Host host) //{ // return ((IHostRepository)CurrentRepository).GetConnectRoomHosts(host); //} public string GetRoomNumber(int hostID) { return CurrentRepository.LoadAll().Where(r => r.ID == hostID && !r.IsDeleted).Select(r => r.RoomNumber).FirstOrDefault(); } public IList GetByGroup(Group group) { return LoadAll().Where(r => r.Group == group).ToList(); } /// /// 删除主机的同时,删除其关联的数据 /// /// public override void Delete(IList idList) { foreach (int id in idList) { HostModalRepository.DeteleByHostID(id);//删除 HostModal HostWordsReportRepository.DeteleByHostID(id); HostFaultsRepository.DeteleByHostID(id); //HostFaultRecordsRepository.DeteleByHostID(id); HostSceneRepository.DeteleByHostID(id); HostRoomCardRepository.DeteleByHostID(id); } ((IHostRepository)(this.CurrentRepository)).Delete(idList); } public void UpdateHost(HostUpdate hostUpdate, FileType fileType, string fileHref, string fileMd5, IList hosts, bool isTFTP) { switch (hostUpdate.FileType) { case FileType.RCUValidate: UpdateRCUFileReceiver.Update(hostUpdate, hosts); break; default: if (isTFTP) { UpdateHostReceiver.Update(hostUpdate, fileType, fileHref, fileMd5, hosts); } else { UpdateHostFTPReceiver.Update(hostUpdate, fileType, fileHref, fileMd5, hosts); } break; } } /// /// 针对C主机升级 /// /// /// /// /// /// public void UpdateHostC(HostUpdate hostUpdate, FileType fileType, string fileHref, string fileMd5, IList hosts) { UpdateHostReceiver.Update(hostUpdate, fileType, fileHref, fileMd5, hosts); } /// /// 修改房态 /// /// /// 2:出租,4:待租,8:退房,16:空房 public void ChangeRoomStatus(Host host, int roomStatusID, string wxValidate) { RoomStatus NNN = NewMethod(host, roomStatusID); ChangeRoomStatus(host, NNN, wxValidate); } private RoomStatus NewMethod(Host host, int roomStatusID) { //目前房态信息有一下4种 //0x01:入住 - 用户插卡取电后,RCU主机上报入住服务 //0x02:退房 - 服务器通过协议下发房态 //0x03:待租 - 服务器通过协议下发房态 //0x04:空房 - 服务器通过协议下发房态 RoomStatus NNN = RoomStatusRepository.Get(roomStatusID); string host_number = host.HostNumber; //string CKey = CacheKey.RoomStatus_Prefix + "_" + host_number; //var q = CSRedisCacheHelper.Get_Partition(CKey); Host host_takeout = null; string Key = CacheKey.HostInfo_Key_HostNumber + "_" + host_number; object obj = MemoryCacheHelper.Get(Key); if (obj != null) { //q.RoomStatus = NNN; //CSRedisCacheHelper.Set_Partition(CKey,q); host_takeout = (Host)obj; host_takeout.RoomStatus = NNN; } return NNN; } /// /// 阿宝要修改的, /// PMS 有房态变化,这里就要产生一个任务 /// /// /// /// public void ChangeRoomStatus(Host host, RoomStatus roomStatus, string wxValidate) { try { logger.Error("触发状态ID:" + roomStatus.ID); RoomStatusChangedReceiver.SendRoomStatus(host, roomStatus); host.RoomStatus = roomStatus; Host host_takeout = null; string Key = CacheKey.HostInfo_Key_HostNumber + "_" + host.HostNumber; object obj = MemoryCacheHelper.Get(Key); if (obj != null) { host_takeout = (Host)obj; host_takeout.RoomStatus = roomStatus; } if (!string.IsNullOrEmpty(wxValidate)) { host.WXValidate = wxValidate; } CurrentRepository.Update(host); #region 语言重置 if (roomStatus.ID == 2 || roomStatus.ID == 8)//开房和退房时重置 { if (!string.IsNullOrEmpty(host.XiaoDuCUID)) { string accessToken = SysOauth2Repository.GetXiaoDuToken(); if (!string.IsNullOrEmpty(accessToken) && host.SysHotel.IsPowerOffResetXiaoDu) { System.Threading.Tasks.Task.Factory.StartNew(() => { foreach (string cuid in host.XiaoDuCUID.Split(','))//多个小度英文逗号隔开 { XiaoDuOperation.PostWebRequestToXiaoDu(accessToken, cuid, new XiaoDuParamJson() { method = "reset" }, host.SysHotel.Code, host.RoomNumber);//重置小度 } }); } } if (!string.IsNullOrEmpty(host.TianMaoCUID)) { System.Threading.Tasks.Task.Factory.StartNew(() => { foreach (string cuid in host.TianMaoCUID.Split(','))//多个英文逗号隔开 { TianMaoOperation.PostWebRequestToTianMao("CheckoutWithAK", Newtonsoft.Json.JsonConvert.SerializeObject(new { HotelId = cuid.Split('&')[0], RoomNo = cuid.Split('&')[1] }), host.SysHotel.Code, host.RoomNumber);//重置天猫精灵 } }); } } #endregion if (roomStatus.ID == 8) { #region 退房后空调控制 HotelSeason hotelSeason = HotelSeasonRepository.LoadByHotelID(host.SysHotel.ID);//获取该酒店下季节设置记录 if (hotelSeason != null) { //条件:1出租后,2取电后,3断电后 List list = HotelAirControlRepository.LoadAll(host.SysHotel.ID, 4, 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设置空调 { #region 备用方案 //var TTT = new Tuple>(host, item, hostModals); //Task.Factory.StartNew((state) => // { // System.Threading.Thread.Sleep(item.DelayTime * 1000);//延迟执行 // Tuple> NNN = state as Tuple>; // var QQ0 = NNN.Item1; // var QQ1 = NNN.Item2; // var QQ2 = NNN.Item3; // foreach (HostModal hostModal in QQ2) // { // HostModalManager.SetDevice(QQ0, hostModal, QQ1.Status, 0, QQ1.SettingTemp, QQ1.FanSpeed, QQ1.Mode, 0);//0表示不变 // } // }, TTT); #endregion try { //这段代码在生产环境中不管用,很奇怪 string KeyMission = System.Guid.NewGuid().ToString("N"); MissonData m = new MissonData() { hostnumber = host.HostNumber, mac = host.MAC, }; m.HostModalList = new List>(); foreach (HostModal hostModal in hostModals) { var t = new Tuple(hostModal.Modal.ModalAddress, hostModal.Modal.Type); m.HostModalList.Add(t); } m.Status = item.Status; m.SettingTemp = item.SettingTemp; m.FanSpeed = item.FanSpeed; m.Mode = item.Mode; string MKey = "TuiFang_" + KeyMission; CSRedisCacheHelper.Set_Partition(MKey, m, 1); DelayExe_Task(host, item.DelayTime, MKey); break; } catch (Exception) { } } } } } } #endregion } if (roomStatus.ID == 2) { #region 出租后空调处理 //阿宝 //空调 在10分钟无人入住的情况之下,就关闭 //启动 一个任务 #region 阿宝添加的 int currenthotelid = host.SysHotel.ID; RoomNobodyHowTo nnn = RoomNoBodyMananger.LoadAll().FirstOrDefault(A => A.CurrentHotelID == currenthotelid); if (nnn != null) { if (!nnn.How.Equals("without")) { string Code = host.SysHotel.Code; string RoomNo = host.RoomNumber; DateTime CreateDate = host.SysHotel.CreatedDate; string CD = CreateDate.ToString("yyyy-MM-dd"); int hotel_id = host.SysHotel.ID; int host_id = host.ID; string ti = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); int delaytime = nnn.DelayTime; int sustain = 20; string MissionKey = System.Guid.NewGuid().ToString("N"); DateTime starttime = DateTime.Now.AddMinutes(delaytime); DateTime endtime = starttime.AddMinutes(sustain); //创建一条任务 插 入数据库 KongTiaoTimer k = new KongTiaoTimer(); k.HotelID = hotel_id; k.HostID = host_id; k.HotelCode = Code; k.RoomNo = RoomNo; k.MissonKey = MissionKey; k.IsCancel = 0; k.CreateTime = ti; k.StartTime = starttime.ToString("yyyy-MM-dd HH:mm:ss"); k.EndTime = endtime.ToString("yyyy-MM-dd HH:mm:ss"); k.CreateDate = CD; //string HotelCode, string RoomNo, int host_id,int hotel_id MissionRequestData mm = new MissionRequestData(); mm.DelayTimer = delaytime; mm.KT = k; //mm.HotelCode = Code; //mm.RoomNo = RoomNo; //mm.HotelID = hotel_id; //mm.HostID = host_id; //mm.CreateDate = CD; string jsstr = Newtonsoft.Json.JsonConvert.SerializeObject(mm); //k.JsonData = jsstr; k.MissonKey = MissionKey; KongTiaoManager.Save(k); //给 任务管理系统 发送消息 var client1 = new RestClient(Missionsys_Address); var request1 = new RestRequest("api/index", Method.POST); logger.Error("任务管理系统发送了数据:" + Missionsys_Address + "API/Index"); //GetRequest ggg = new GetRequest() { creatDate = DateTime.Now.ToString("yyyy-mm-dd"), roomNumber = RoomNo, code = Code }; request1.AddParameter("jsonData", jsstr); client1.ExecuteAsync(request1, (response) => { }); } } #endregion HotelSeason hotelSeason = HotelSeasonRepository.LoadByHotelID(host.SysHotel.ID);//获取该酒店下季节设置记录 if (hotelSeason != null) { List list = HotelAirControlRepository.LoadAll(host.SysHotel.ID, 1, 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设置空调 { var TTT = new Tuple>(host, item, hostModals); Task.Factory.StartNew((state) => { System.Threading.Thread.Sleep(item.DelayTime * 1000);//延迟执行 Tuple> NNN = state as Tuple>; var QQ0 = NNN.Item1; var QQ1 = NNN.Item2; var QQ2 = NNN.Item3; foreach (HostModal hostModal in QQ2) { //host 只需要hostnumber和mac //hostmodal只需要 address //和type //device.Address = hostModal.Modal.ModalAddress; //device.Type = hostModal.Modal.Type; HostModalManager.SetDevice(QQ0, hostModal, QQ1.Status, 0, QQ1.SettingTemp, QQ1.FanSpeed, QQ1.Mode, 0);//0表示不变 } }, TTT); try { //这段代码在生产环境中不管用,很奇怪 //string KeyMission = System.Guid.NewGuid().ToString("N"); //MissonData m = new MissonData() //{ // hostnumber = host.HostNumber, // mac = host.MAC, //}; //m.HostModalList = new List>(); //foreach (HostModal hostModal in hostModals) //{ // var t = new Tuple(hostModal.Modal.ModalAddress, hostModal.Modal.Type); // m.HostModalList.Add(t); //} //m.Status = item.Status; //m.SettingTemp = item.SettingTemp; //m.FanSpeed = item.FanSpeed; //m.Mode = item.Mode; //string MKey = "Mission_" + KeyMission; //CSRedisCacheHelper.Set_Partition(MKey, m, 1); //DelayExe_Task(host, item.DelayTime, KeyMission); break; } catch (Exception) { } } } } } } #endregion } } catch (Exception ex) { logger.Error(ex.Message); logger.Error(ex.StackTrace); } } public class MissonData { public string hostnumber { get; set; } public string mac { get; set; } public List> HostModalList { get; set; } public int Status { get; set; } public int SettingTemp { get; set; } public int FanSpeed { get; set; } public int Mode { get; set; } } /// /// 任务管理系统是 分钟,这里是秒 /// /// /// 秒 /// private static void DelayExe_Task(Host host, int delaytime, string MissionKey) { string Code = host.SysHotel.Code; string RoomNo = host.RoomNumber; DateTime CreateDate = host.SysHotel.CreatedDate; string CD = CreateDate.ToString("yyyy-MM-dd"); int hotel_id = host.SysHotel.ID; int host_id = host.ID; string ti = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); int sustain = 20; DateTime starttime = DateTime.Now.AddSeconds(delaytime); DateTime endtime = starttime.AddMinutes(sustain); //创建一条任务 插 入数据库 KongTiaoTimer k = new KongTiaoTimer(); k.HotelID = hotel_id; k.HotelCode = Code; k.RoomNo = RoomNo; k.MissonKey = MissionKey; k.IsCancel = 0; k.CreateTime = ti; k.StartTime = starttime.ToString("yyyy-MM-dd HH:mm:ss"); k.EndTime = endtime.ToString("yyyy-MM-dd HH:mm:ss"); k.CreateDate = CD; MissionRequestData mm = new MissionRequestData(); mm.DelayTimer = delaytime; mm.KT = k; string jsstr = Newtonsoft.Json.JsonConvert.SerializeObject(mm); logger.Error("任务管理:" + jsstr); //给 任务管理系统 发送消息 var client1 = new RestClient(Missionsys_Address); var request1 = new RestRequest("api/index_sec", Method.POST); request1.AddParameter("jsonData", jsstr); client1.ExecuteAsync(request1, (response) => { }); } /// /// 批量更改主机网络设置 /// /// RCU主机列表 /// IP地址 /// 子网掩码 /// 默认网关 /// 通讯端口 public void ChangeNetworkSetting(IList hostList, string ip, string subnetmask, string gateway, ushort port) { foreach (var host in hostList) { string newIP = GetNewIP(host.IP, ip); if (!NetworkSettingReceiver.SetNetwork(host, newIP, subnetmask, gateway, port)) { throw new ApplicationException("设置客房【" + host.RoomNumber + "】主机网络参数失败。"); } host.IP = newIP; host.SubnetMask = subnetmask; host.Gateway = gateway; host.Port = port; CurrentRepository.Update(host); } } #endregion #region Private Methods private bool UpdateHostAirs(Host host) { HostAirRepository.DeteleByHostID(host.ID); var list = RoomTypeAirRepository.LoadAll().Where(r => r.RoomType == host.RoomType); foreach (var modal in list) { var hostAir = new HostAir(); hostAir.HostID = host.ID; hostAir.Modal = modal; hostAir.ControlType = host.RoomType.ControlType; HostAirRepository.SaveOrUpdate(hostAir); } return true; } private bool UpdateHostModals(Host host) { if (host == null) { return false; } HostModalRepository.DeteleByHostID(host.ID); var list = RoomTypeModalRepository.LoadAll().Where(r => r.RoomType == host.RoomType); DateTime now = DateTime.Now; foreach (var modal in list) { HostModalRepository.Save(new HostModal { HostID = host.ID, Modal = modal, Status = 2, Time = 0, UpdateTime = now }); } return true; } /// /// 创建服务异常 /// /// /// private bool CreateServiceAndAbnormity(Host host) { if (host == null) { return false; } try { var services = RoomServiceRepository.LoadAll(host.ID); foreach (var service in services) { RoomServiceRepository.Delete(service.ID); } var servicesSetting = AlarmSettingRepository.LoadAll().Where(r => r.HotelID == host.SysHotel.ID && (r.Type == 'B' || r.Type == 'C')); foreach (var serviceSetting in servicesSetting) { var service = new RoomService(); service.HostID = host.ID; service.AlarmType = serviceSetting.Type; service.AlarmCode = serviceSetting.Code; service.Status = false; RoomServiceRepository.Save(service); } return true; } catch (Exception) { return false; } } /// /// 读取连通房到 connectingRooms 中 /// /// /// //private void ReadConnectRoomsToList(Host host, IList connectingRooms) //{ // if (String.IsNullOrEmpty(host.ConnectingRooms)) // { // return; // } // var hosts = host.ConnectingRooms.Split(',').Select(r => Get(int.Parse(r))); // foreach (var h in hosts) // { // if (h != null && !connectingRooms.Contains(h)) // { // connectingRooms.Add(h); // } // } //} /// /// 复制ip2地址前两段到ip1 /// /// IP1 /// IP2 /// private string GetNewIP(string ip1, string ip2) { string[] ip1Arr = ip1.Split('.'); string[] ip2Arr = ip2.Split('.'); ip1Arr[0] = ip2Arr[0]; ip1Arr[1] = ip2Arr[1]; return String.Join(".", ip1Arr); } /// /// 处理“退房保险箱关”异常 /// /// private void ProcessAbnormities(Host host) { //如果是退房,并且保险箱是关的状态,报警,否则存在此报警,关掉 var abnormity = RoomServiceRepository.Get(host.ID, "C04"); if (host.RoomStatus.ID == 0x08) { if (host.SafeStatus == 0 && abnormity != null && !abnormity.Status) { abnormity.Status = true; abnormity.StartTime = DateTime.Now; RoomServiceRepository.Update(abnormity); } } else //if (host.SafeStatus != 0) { if (abnormity != null && abnormity.Status) { abnormity.Status = false;//关掉报警 abnormity.StartTime = DateTime.Now; RoomServiceRepository.Update(abnormity); } } } #endregion public void AccreditForHost(IList hostList, DateTime expires) { AuthorizationReceiver.AccreditForHost(hostList, expires); } public void SetDeviceSecret(Host host) { DeviceSecretReceiver.Send(host); } public void SendForGetHostSecret(Host host) { HostSecretReceiver.Send(host); } public void SyncHostInfo(Host host) { HostRegisterReceiver.Send(host); } public void PublishHostInfo(Host host) { HostRegisterSetReceiver.Send(host); } public void PublishHostInfo(Host host, byte[] sendData) { HostRegisterSetReceiver.Send(host, sendData); } /// /// 根据房型获取主机列表(C主机升级使用) /// /// /// /// public IList LoadHostByRoomType(int hotelID, int roomTypeID) { return (CurrentRepository as Dao.IHostRepository).LoadHostByRoomType(hotelID, roomTypeID); } public IList LoadHostByRoomTypeChengZiHao(int hotelID, int roomTypeID, string roomNumber) { return (CurrentRepository as Dao.IHostRepository).LoadHostByRoomTypeChengZiHao(hotelID, roomTypeID, roomNumber); } /// /// 根据房型获取所有主机列表 /// /// /// /// public IList LoadAllHostByRoomType(int hotelID, int roomTypeID) { return (CurrentRepository as Dao.IHostRepository).LoadAllHostByRoomType(hotelID, roomTypeID); } /// /// 阿宝 /// public List GetInitializeKTMission() { return KongTiaoManager.Select(); } public static readonly string Missionsys_Address = ConfigurationManager.AppSettings["missionsys_address"]; public static readonly string Currentsys_address = ConfigurationManager.AppSettings["currentsys_address"]; public void TimerECO(string hotelcode, int sheng_jiang_value) { try { int finallytemp = 0; //模式:1制冷,2制热,3送风 var hostlist = HostRepository.GetByHotelCode(hotelcode); foreach (var item in hostlist) { List hostModals = HostModalRepository.LoadByHostID(item.ID).Where(r => r.Modal.Type == DeviceType.AirConditioner && r.Modal.ActiveIndicator).ToList(); foreach (HostModal hostModal in hostModals) { string KKey = CacheKey.HostModalStatus_Prefix + "_" + item.ID + "_" + hostModal.Modal.ModalAddress; var mm = CSRedisCacheHelper.Get_Partition(KKey); if (mm != null) { int s = mm.Status; int sss = mm.AirConditionData.SettingTemp; int model = mm.AirConditionData.Mode; if (s == 1) { if (model == 1) { finallytemp = sss + sheng_jiang_value; } if (model == 2) { finallytemp = sss - sheng_jiang_value; } //获取 触发的 酒店 //循环这些 酒店,获取每个房间,获取每个房间的 空调,如何开的话 ,就触发 Host host111 = new Host(); host111.HostNumber = item.HostNumber; host111.MAC = item.MAC; //host 只需要hostnumber和mac //hostmodal只需要 address 和type //device.Address = hostModal.Modal.ModalAddress; //device.Type = hostModal.Modal.Type; HostModal hm = new HostModal(); hm.Modal = new RoomTypeModal(); hm.Modal.Type = DeviceType.AirConditioner; hm.Modal.ModalAddress = hostModal.Modal.ModalAddress; logger.Error("ECO系统要开始执行了:" + host111.RoomNumber + " air_condition stattus: " + finallytemp); //HostModalManager.SetDevice(host111, hm, 1, 0, GenericData.SetTemperatureValue, GenericData.FanSpeed, GenericData.Mode, 0);//0表示不变 HostModalManager.SetDevice(host111, hm, 0, 0, finallytemp, 0, 0, 0);//0表示不变 } } } } } catch (Exception ex) { logger.Error("ECO 系统出异常了" + ex.Message); } } /// /// 任务控制 /// /// /// /// /// /// public void AirConditionTimer_Controller(int hotel_id, string HotelCode, string HotelCreateDate, int host_id, string RoomNo, KongTiaoTimer k) { try { string LieECOTaskKey = CacheKey.LieECOTask; string MKey = k.MissonKey; bool OldOrNew0 = MKey.StartsWith("TuiFang"); bool OldOrNew1 = MKey.StartsWith("Mission"); bool OldOrNew2 = MKey.StartsWith(LieECOTaskKey); if (OldOrNew0) { NewMission(MKey); return; } else if (OldOrNew1) { NewMission(MKey); return; } else if (OldOrNew2) { var GenericData = CSRedisCacheHelper.Get_Partition(MKey, 1); if (GenericData != null) { try { Host host111 = new Host(); host111.HostNumber = GenericData.HostNUMBER; host111.MAC = GenericData.MAC; //host 只需要hostnumber和mac //hostmodal只需要 address 和type //device.Address = hostModal.Modal.ModalAddress; //device.Type = hostModal.Modal.Type; HostModal hm = new HostModal(); hm.Modal = new RoomTypeModal(); hm.Modal.Type = DeviceType.AirConditioner; hm.Modal.ModalAddress = GenericData.ModalAddress; logger.Error("ECO系统要开始执行了:" + host111.RoomNumber + " air_condition stattus: " + GenericData.SetTemperatureValue); //HostModalManager.SetDevice(host111, hm, 1, 0, GenericData.SetTemperatureValue, GenericData.FanSpeed, GenericData.Mode, 0);//0表示不变 HostModalManager.SetDevice(host111, hm, 0, 0, GenericData.SetTemperatureValue, 0, 0, 0);//0表示不变 } catch (Exception ex) { logger.Error("ECO 系统出异常了" + ex.Message); } } } else { string ct = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); RoomNobodyHowToLog n = new RoomNobodyHowToLog() { MissionKey = MKey, CreateTime = ct }; Host host = GetByRoomNumber(RoomNo, hotel_id); if (host == null) { return; } //查询 现在有没有补取电 //string KKey = CacheKey.HostModalStatus_Prefix + "_" +host_id + "_" + device.Value.Address; //var client = new RestClient("https://pms.boonlive-rcu.com/"); //var client = new RestClient(Currentsys_address); //var request = new RestRequest("api/GetRoomServiceList", Method.GET); //GetRequest ggg = new GetRequest() { creatDate = HotelCreateDate, roomNumber = RoomNo, code = HotelCode }; //string jsstr = Newtonsoft.Json.JsonConvert.SerializeObject(ggg); //request.AddParameter("jsonData", jsstr); //var response = client.Execute(request); //string str = response.Content; logger.Error("222:"); //logger.Error("333333:" + str); string KKey = CacheKey.HostModalStatus_Prefix + "_" + host.ID + "_" + "004000001"; var mm = CSRedisCacheHelper.Get_Partition(KKey); //333333:{"IsSuccess":true,"Result":[{"ModalAddress":"004000002","Name":"勿扰","Status":2,"Brightness":0},{"ModalAddress":"004000003","Name":"清理","Status":2,"Brightness":0}]} //{"IsSuccess":true,"Result":[{"ModalAddress":"004000001", // "Name":"取电","Status":2,"Brightness":0}, //{"ModalAddress":"004000003","Name":"清理","Status":2,"Brightness":0}]} if (mm != null) { var Nstr = Newtonsoft.Json.JsonConvert.SerializeObject(mm); logger.Error("222:" + Nstr); logger.Error("takecard:" + mm.Status); //超过了30分钟,还没有取电 //如果没有取电就关了空调 //1 为取电,2为没有取电 if (mm.Status != 1) { //获取启用的空调回路 List hostModals = HostModalRepository.LoadByHostID(host_id).Where(r => r.Modal.Type == DeviceType.AirConditioner && r.Modal.ActiveIndicator).ToList(); RoomNobodyHowTo nnn = RoomNoBodyMananger.LoadAll().FirstOrDefault(A => A.CurrentHotelID == hotel_id); foreach (HostModal hostModal in hostModals) { if (nnn != null) { logger.Error("nnn.how " + nnn.How); //close or monitor if (nnn.How.Equals("close")) { //0表示不变 HostModalManager.SetDevice(host, hostModal, 2, 0); RoomNoBodyLogMananger.Save(n); } else if (nnn.How.Equals("monitor")) { //状态:1开,2关,6停 //0表示不变 //如果只调温的话,所有的数据都要设置为0 HostModalManager.SetDevice(host, hostModal, 0, 0, nnn.Temperature); RoomNoBodyLogMananger.Save(n); logger.Error("monitor is !!!!" + nnn.Temperature); } else { } } } logger.Error("Air Condition Controller"); //空调关闭后,就将任务设置成已经完成了 k.IsCancel = 1; KongTiaoManager.Update(k); } } } } catch (Exception) { } } private void NewMission(string MKey) { var MMK = CSRedisCacheHelper.Get_Partition(MKey, 1); if (MMK != null) { Host host111 = new Host(); host111.HostNumber = MMK.hostnumber; host111.MAC = MMK.mac; var L = MMK.HostModalList; foreach (var hostModal in L) { //host 只需要hostnumber和mac //hostmodal只需要 address 和type //device.Address = hostModal.Modal.ModalAddress; //device.Type = hostModal.Modal.Type; HostModal hm = new HostModal(); hm.Modal = new RoomTypeModal(); hm.Modal.Type = hostModal.Item2; hm.Modal.ModalAddress = hostModal.Item1; logger.Error("delay Mission start:" + host111.RoomNumber + " air_condition stattus: " + MMK.Status); HostModalManager.SetDevice(host111, hm, MMK.Status, 0, MMK.SettingTemp, MMK.FanSpeed, MMK.Mode, 0);//0表示不变 } } return; } public void LoggerTest() { string MKey = "aaaaaaaaa"; string ct = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); RoomNobodyHowToLog n = new RoomNobodyHowToLog() { MissionKey = MKey, CreateTime = ct }; RoomNoBodyLogMananger.Save(n); } /// /// ECO模式执行 /// public void ECO_Execute(string hotelid_api) { try { logger.Error("ECO_Execute here"); //取出ECO配置的酒店 的房间号 List ECOList = ECO_SettingRepository.LoadAll().ToList(); if (ECOList.Count > 0) { foreach (var ECO in ECOList) { int hotelid = ECO.HotelID; bool isenable = ECO.IsEnable; string st_time = ECO.StartTime; string[] h_m = st_time.Split(':'); int a1 = 0; int.TryParse(h_m[0], out a1); int b1 = 0; int.TryParse(h_m[1], out b1); string et_time = ECO.EndTime; string[] h_m_1 = et_time.Split(':'); int a2 = 0; int.TryParse(h_m_1[0], out a2); int b2 = 0; int.TryParse(h_m_1[1], out b2); var ccc = DateTime.Now; var start_time = new DateTime(ccc.Year, ccc.Month, ccc.Day, a1, b1, 0); var end_time = new DateTime(ccc.Year, ccc.Month, ccc.Day, a2, b2, 0); //节能模式开启了 if (isenable) { //当前时间在两个时间 区间内 if (ccc > start_time && ccc < end_time) { //获取当前酒店的主机 //IList hosts = LoadAll(hotelid).Where(r => r.Status == true).ToList(); IList hosts = LoadAll(hotelid).ToList(); foreach (Host host in hosts) { int host_id = host.ID; //查看是否执行过了 ECO_Detail detail = ECO_DetailRepository.GetDetail(hotelid, host_id); if (detail == null) { AirConditionECO_Execute(ECO, host); ECO_Detail e = new ECO_Detail(); e.HotelID = hotelid; e.HostID = host_id; e.IsTrigger = true; e.RoomNo = host.RoomNumber; string ct = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); e.TriggerTime = ct; e.ECO_ID = ECO.ID; ECO_DetailRepository.Add(e); } if (detail != null && !detail.IsTrigger) { //获取启用的空调回路 AirConditionECO_Execute(ECO, host); detail.IsTrigger = true; string ct = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); detail.TriggerTime = ct; ECO_DetailRepository.Update(detail); } } } } } } } catch (Exception ex) { logger.Error("ECO execute error: " + ex.Message); } } /// /// 重置 /// public void Zero_Refresh() { ECO_DetailRepository.ZeroRefresh(); } private void AirConditionECO_Execute(ECO_Setting ECO, Host host) { int host_id = host.ID; //根据主机编号,获取所有的空调 //获取所有空调的数据 List hostModals = HostModalRepository.LoadByHostID(host_id).Where(r => r.Modal.Type == DeviceType.AirConditioner && r.Modal.ActiveIndicator).ToList(); foreach (HostModal hostModal in hostModals) { string KKey = CacheKey.HostModalStatus_Prefix + "_" + host_id + "_" + hostModal.Modal.ModalAddress; var obj = CSRedisCacheHelper.Get_Partition(KKey); if (obj != null) { HostModal_Cache hhh = obj as HostModal_Cache; if (hhh.AirConditionData.AirStatus == 1 && hhh.Status == 1) { int settemp = 0; //0x01:制冷 //0x02:制热 //0x03:送风 int moshi = hhh.AirConditionData.Mode; if (moshi == 1) { //如果是制冷 ,那就将温度调高一些 settemp = hhh.AirConditionData.CurrentTemp + ECO.ActValue; } else if (moshi == 2) { settemp = hhh.AirConditionData.CurrentTemp - ECO.ActValue; } else { } hostModal.Brightness = hhh.Brightness; hostModal.Status = hhh.Status; hostModal.SettingTemp = hhh.AirConditionData.SettingTemp; hostModal.CurrentTemp = hhh.AirConditionData.CurrentTemp; hostModal.Mode = hhh.AirConditionData.Mode; hostModal.FanSpeed = hhh.AirConditionData.FanSpeed; hostModal.Valve = hhh.AirConditionData.Valve; //状态:1开,2关,6停 //0表示不变 //如果只调温的话,所有的数据都要设置为0 HostModalManager.SetDevice(host, hostModal, 0, 0, settemp); } } } } public List Get_ECOList() { return ECO_SettingRepository.LoadAll().Where(A => A.IsEnable == true).ToList(); } /// /// 查询 /// /// /// /// public void Send_Query_Data(byte[] data, string host_number, string mac) { TFTP_LogReceiver.Send_QueryData(data, host_number, mac); } /// /// 发送设置 /// /// /// /// public void Send_Setting_Data(byte[] data, string host_number, string mac) { TFTP_LogSettingReceiver.Send_Setting_Data(data, host_number, mac); } /// /// /// /// /// /// public Host GetByRoomNumber(int roomid, int hotelID) { return CurrentRepository.LoadAll().FirstOrDefault(r => r.ID == roomid && r.SysHotel.ID == hotelID && !r.IsDeleted); } public Host GetByHiWeiCUID(string cuid) { return (CurrentRepository as Dao.IHostRepository).GetByHiWeiCUID(cuid); } public void PublishUDPData(string hostnumber, string mac, byte[] data, byte cmdtype, bool isoriginal) { HostUDPTouChuan.Send(hostnumber, mac, data, cmdtype, isoriginal); } public IList LoadAllID_HostNumberMapping() { return (CurrentRepository as Dao.IHostRepository).LoadAllID_HostNumberMapping(); } public IList LoadAll_RoomNumberMapping() { return (CurrentRepository as Dao.IHostRepository).LoadAll_RoomNumberMapping(); } } // //{"IsSuccess":true,"Result":[{"ModalAddress":"004000001", // "Name":"取电","Status":2,"Brightness":0}, //{"ModalAddress":"004000003","Name":"清理","Status":2,"Brightness":0}]} public class ResultData { public bool IsSuccess { get; set; } public List Result { get; set; } } public class MySheBei { public string ModalAddress { get; set; } public string Name { get; set; } public int Status { get; set; } public int Brightness { get; set; } } //"{\"creatDate\":\"2023-11-16\",\"roomNumber\":\"2206\",\"code\":\"1762\"}" public class GetRequest { public string creatDate { get; set; } public string roomNumber { get; set; } public string code { get; set; } } }