Files
Web_CRICS_Server_VS2010_Prod/RCUHost/Implement/RoomCardReceiver.cs
2025-12-11 09:17:16 +08:00

442 lines
22 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using Common;
using Dao;
using Domain;
using RCUHost.Protocols;
using System.Xml;
using System.Threading.Tasks;
using CommonEntity;
namespace RCUHost.Implement
{
/// <summary>
/// 插卡取电 Receiver
/// </summary>
public class RoomCardReceiver : GenericReceiverBase
{
private static log4net.ILog logger = log4net.LogManager.GetLogger(typeof(RoomCardReceiver));
//private static string debug_hotel_code = System.Configuration.ConfigurationManager.AppSettings["debug_hotel_code"];
public IHostRepository HostRepository { get; set; }
public IRoomCardRepository RoomCardRepository { get; set; }
public IHostRoomCardRepository HostRoomCardRepository { get; set; }
public IRoomCardTypeRepository RoomCardTypeRepository { get; set; }
public IAlarmSettingRepository AlarmSettingRepository { get; set; }
public IRoomServiceRepository RoomServiceRepository { get; set; }
public IRoomServiceRecordRepository RoomServiceRecordRepository { get; set; }
public IHostModalRepository HostModalRepository { get; set; }
public override void Process(ReceiverContext context)
{
Reply(context);
string HostNumberOnly = context.SystemHeader.Value.HostNumber.ToString();
int startIndex = StructConverter.SizeOf(context.SystemHeader);
InsertCardPacket? packet = DecodeInsertCardPacket(context.Data, startIndex);
if (packet.HasValue)
{
//SomeDeviceExistsData host = null;
//RoomStatusReceiver R = new RoomStatusReceiver();
//host = R.HostDataTake(context);
Host host = null;
string Key = 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);
host = host_O;
}
if (host != null)
{
//Host hhh = new Host();
//hhh.ID = host.HostID;
//hhh.FrameNo = host.FrameNo;
//hhh.PowerSupply = host.PowerSupply;
//hhh.LockVoltage = host.LockVoltage;
//hhh.HostTemp = host.HostTemp;
//var tuple_a = state as Tuple<Host, InsertCardPacket?>;
//var host = tuple_a.Item1;
//var packet = tuple_a.Item2;
switch (packet.Value.InsertCard)
{
case 1://插卡
var cardType = RoomCardTypeRepository.Get((int)packet.Value.CardType);//获取房卡类型
if (cardType == null)
{
cardType = RoomCardTypeRepository.Get(1);//如果没有记录,获取有人房卡类型
}
var roomCard = RoomCardRepository.GetByCartType(cardType, packet.Value.CardNumber.ToString(), host.SysHotel.ID); //GetRoomCard(packet.Value.CardNumber.ToString(), cardType);
if (roomCard == null)//如果该房卡未创建记录,自动创建
{
roomCard = new RoomCard();
roomCard.CardNumber = packet.Value.CardNumber.ToString();
roomCard.RoomCardType = cardType;
roomCard.HotelID = host.SysHotel.ID;
RoomCardRepository.Save(roomCard);
}
HostRepository.SetRoomCard(host, roomCard);
break;
default://拔卡
HostRepository.SetRoomCard(host, null);
break;
}
}
}
}
/// <summary>
/// 处理连通房插卡取电
/// </summary>
/// <param name="host"></param>
//private void ProcessConnectingRooms(Host host, byte insertCard, RoomCardType cardType, RoomCard roomCard)
//{
// byte[] data = CreateInsertCardDataPacket(insertCard, cardType, roomCard);
// var connectingRoomHosts = HostRepository.GetConnectRoomHosts(host);
// foreach (var host1 in connectingRoomHosts)
// {
// Send(data, host.HostNumber);// host1.IP, host1.Port);
// }
//}
/// <summary>
/// 处理房卡相关逻辑
/// </summary>
/// <param name="host"></param>
private void ProcessRoomCard(Host host)
{
#region
{
var abnormitySetting = AlarmSettingRepository.Get(host.SysHotel.ID, 'C', "C03");
var abnormity = RoomServiceRepository.Get(host.ID, abnormitySetting.Code);
if (abnormitySetting != null && abnormity != null)
{
bool isUpdated = false;
//如果非客人,且已出租,且保险箱开,则报警
if (host.RoomCard != null && host.RoomCard.RoomCardType != null && host.RoomCard.RoomCardType.ID != 0x20 &&
host.RoomStatus != null && host.RoomStatus.ID == 0x02 && host.SafeStatus == 1)
{
isUpdated = true;
if (!abnormity.Status)
{
abnormity.Status = true;
abnormity.StartTime = DateTime.Now;
RoomServiceRepository.Update(abnormity);
var abnormityRecord = RoomServiceRecordRepository.Get(host.ID, "C03", true);
if (abnormityRecord == null)
{
abnormityRecord = RoomServiceRecordRepository.CreateServiceRecord(host, abnormitySetting);
RoomServiceRecordRepository.Save(abnormityRecord);
}
}
}
if (!isUpdated)//关掉报警
{
if (abnormity.Status)
{
abnormity.Status = false;
abnormity.StartTime = DateTime.Now;
RoomServiceRepository.Update(abnormity);
var abnormityRecord = RoomServiceRecordRepository.Get(host.ID, "C03", true);
if (abnormityRecord != null)
{
abnormityRecord.Status = false;
abnormityRecord.EndTime = DateTime.Now;
RoomServiceRecordRepository.Update(abnormityRecord);
}
}
}
}
}
#endregion
#region
{
// "非客人在房门关报警" 设置
var abnormitySetting = AlarmSettingRepository.Get(host.SysHotel.ID, 'A', "A05");
if (abnormitySetting != null)
{
bool isUpdated = false;
var abnormity = RoomServiceRepository.Get(host.ID, "C06");
if (abnormity != null && host.RoomCard != null && host.RoomCard.RoomCardType != null && host.RoomCard.RoomCardType.ID != 0x20 && !host.DoorLockStatus)
{
isUpdated = true;
var delaySetting = AlarmSettingRepository.Get(host.SysHotel.ID, 'A', "A06");
if (delaySetting == null || Convert.ToInt16(delaySetting.Value) == 0)//不延时报警
{
if (!abnormity.Status && abnormity.StartTime < DateTime.Now.AddSeconds(-Convert.ToInt16(delaySetting.Value)))
{
abnormity.Status = true;
abnormity.StartTime = DateTime.Now;
RoomServiceRepository.Update(abnormity);
// “非客人在房门关”异常 记录
var abnormityRecordSetting = AlarmSettingRepository.Get(host.SysHotel.ID, 'C', "C06");
var abnormityRecord = RoomServiceRecordRepository.Get(host.ID, "C06", true);
if (abnormityRecordSetting != null && abnormityRecord == null)
{
abnormityRecord = RoomServiceRecordRepository.CreateServiceRecord(host, abnormityRecordSetting);
RoomServiceRecordRepository.Save(abnormityRecord);
}
}
}
else
{
//启用线程执行延时报警
Tools.SetTimeout(Convert.ToInt16(delaySetting.Value) * 1000, delegate
{
if (!abnormity.Status)
{
abnormity.Status = true;
abnormity.StartTime = DateTime.Now;
RoomServiceRepository.Update(abnormity);
// “非客人在房门关”异常 记录
var abnormityRecordSetting = AlarmSettingRepository.Get(host.SysHotel.ID, 'C', "C06");
var abnormityRecord = RoomServiceRecordRepository.Get(host.ID, "C06", true);
if (abnormityRecordSetting != null && abnormityRecord == null)
{
abnormityRecord = RoomServiceRecordRepository.CreateServiceRecord(host, abnormityRecordSetting);
RoomServiceRecordRepository.Save(abnormityRecord);
}
}
});
}
}
if (!isUpdated)
{
if (abnormity != null && abnormity.Status)
{
abnormity.Status = false;
abnormity.StartTime = DateTime.Now;
RoomServiceRepository.Update(abnormity);
// “非客人在房门关 记录
var abnormityRecord = RoomServiceRecordRepository.Get(host.ID, "C06", true);
if (abnormityRecord != null)
{
abnormityRecord.Status = false;
abnormityRecord.EndTime = DateTime.Now;
RoomServiceRecordRepository.Update(abnormityRecord);
}
}
}
}
}
#endregion
#region
{
// "无人在房门开报警" 设置
var abnormitySetting = AlarmSettingRepository.Get(host.SysHotel.ID, 'A', "A03");
if (abnormitySetting != null)
{
if (host.RoomCard == null && host.DoorLockStatus)
{
//报警延时设置
var delaySetting = AlarmSettingRepository.Get(host.SysHotel.ID, 'A', "A04");
if (delaySetting == null || Convert.ToInt16(delaySetting.Value) == 0)//不延时报警
{
var abnormity = RoomServiceRepository.Get(host.ID, "C02");
if (abnormity != null && !abnormity.Status)
{
abnormity.Status = true;
abnormity.StartTime = DateTime.Now;
RoomServiceRepository.Update(abnormity);
// “无人房门开”异常 记录
var abnormityRecordSetting = AlarmSettingRepository.Get(host.SysHotel.ID, 'C', "C02");
var abnormityRecord = RoomServiceRecordRepository.Get(host.ID, "C02", true);
if (abnormityRecordSetting != null && abnormityRecord == null)
{
abnormityRecord = RoomServiceRecordRepository.CreateServiceRecord(host, abnormityRecordSetting);
RoomServiceRecordRepository.Save(abnormityRecord);
}
}
}
else
{
//启用线程执行延时报警
Tools.SetTimeout(Convert.ToInt16(delaySetting.Value) * 1000, delegate
{
var abnormity = RoomServiceRepository.Get(host.ID, "C02");
if (abnormity != null && !abnormity.Status && abnormity.StartTime < DateTime.Now.AddSeconds(-Convert.ToInt16(delaySetting.Value)))
{
abnormity.Status = true;
abnormity.StartTime = DateTime.Now;
RoomServiceRepository.Update(abnormity);
// “无人房门开”异常 记录
var abnormityRecordSetting = AlarmSettingRepository.Get(host.SysHotel.ID, 'C', "C02");
var abnormityRecord = RoomServiceRecordRepository.Get(host.ID, "C02", true);
if (abnormityRecordSetting != null && abnormityRecord == null)
{
abnormityRecord = RoomServiceRecordRepository.CreateServiceRecord(host, abnormityRecordSetting);
RoomServiceRecordRepository.Save(abnormityRecord);
}
}
});
}
}
else
{
var abnormity = RoomServiceRepository.Get(host.ID, "C02");
if (abnormity != null && abnormity.Status)
{
abnormity.Status = false;
abnormity.StartTime = DateTime.Now;
RoomServiceRepository.Update(abnormity);
// “无人房门开”异常 记录
var abnormityRecord = RoomServiceRecordRepository.Get(host.ID, "C02", true);
if (abnormityRecord != null)
{
abnormityRecord.Status = false;
abnormityRecord.EndTime = DateTime.Now;
RoomServiceRecordRepository.Update(abnormityRecord);
}
}
}
}
}
#endregion
#region
{
// "客人在房门开报警" 设置
var abnormitySetting = AlarmSettingRepository.Get(host.SysHotel.ID, 'A', "A01");
if (abnormitySetting != null)
{
if (host.RoomCard != null && host.RoomCard.RoomCardType != null && host.RoomCard.RoomCardType.ID == 0x20 && host.DoorLockStatus)
{
//报警延时设置
var delaySetting = AlarmSettingRepository.Get(host.SysHotel.ID, 'A', "A02");
if (delaySetting == null || Convert.ToInt16(delaySetting.Value) == 0)//不延时报警
{
var abnormity = RoomServiceRepository.Get(host.ID, "C01");
if (abnormity != null && !abnormity.Status)
{
abnormity.Status = true;
abnormity.StartTime = DateTime.Now;
RoomServiceRepository.Update(abnormity);
// “客人在房门开”异常 记录
var abnormityRecordSetting = AlarmSettingRepository.Get(host.SysHotel.ID, 'C', "C01");
var abnormityRecord = RoomServiceRecordRepository.Get(host.ID, "C01", true);
if (abnormityRecordSetting != null && abnormityRecord == null)
{
abnormityRecord = RoomServiceRecordRepository.CreateServiceRecord(host, abnormityRecordSetting);
RoomServiceRecordRepository.Save(abnormityRecord);
}
}
}
else
{
//启用线程执行延时报警
Tools.SetTimeout(Convert.ToInt16(delaySetting.Value) * 1000, delegate
{
var abnormity = RoomServiceRepository.Get(host.ID, "C01");
if (abnormity != null && !abnormity.Status && abnormity.StartTime < DateTime.Now.AddSeconds(-Convert.ToInt16(delaySetting.Value)))
{
abnormity.Status = true;
abnormity.StartTime = DateTime.Now;
RoomServiceRepository.Update(abnormity);
// “客人在房门开”异常 记录
var abnormityRecordSetting = AlarmSettingRepository.Get(host.SysHotel.ID, 'C', "C01");
var abnormityRecord = RoomServiceRecordRepository.Get(host.ID, "C01", true);
if (abnormityRecordSetting != null && abnormityRecord == null)
{
abnormityRecord = RoomServiceRecordRepository.CreateServiceRecord(host, abnormityRecordSetting);
RoomServiceRecordRepository.Save(abnormityRecord);
}
}
});
}
}
else
{
var abnormity = RoomServiceRepository.Get(host.ID, "C01");
if (abnormity != null && abnormity.Status)
{
abnormity.Status = false;
abnormity.StartTime = DateTime.Now;
RoomServiceRepository.Update(abnormity);
// “客人在房门开”异常 记录
var abnormityRecord = RoomServiceRecordRepository.Get(host.ID, "C01", true);
if (abnormityRecord != null)
{
abnormityRecord.Status = false;
abnormityRecord.EndTime = DateTime.Now;
RoomServiceRecordRepository.Update(abnormityRecord);
}
}
}
}
}
#endregion
}
//private RoomCard GetRoomCard(string cardNumber, RoomCardType cardType)
//{
// return RoomCardRepository.Get(cardType, cardNumber);
//}
/// <summary>
/// 获取最后一次插卡未拔卡的记录
/// </summary>
/// <param name="hostID"></param>
/// <returns></returns>
private HostRoomCard GetLastHostRoomCard(int hostID)
{
return HostRoomCardRepository.GetLastHostRoomCard(hostID);
}
/// <summary>
/// 创建插卡数据包
/// </summary>
/// <returns></returns>
private byte[] CreateInsertCardDataPacket(byte insertCard, RoomCardType cardType, RoomCard roomCard)
{
using (MemoryStream stream = new MemoryStream())
{
var headerLen = StructConverter.SizeOf(typeof(SystemHeader));
stream.Seek(headerLen, SeekOrigin.Begin);
stream.WriteByte(insertCard);
stream.WriteByte((byte)(cardType != null ? cardType.ID : 0));
int cardNumber = 0;
if (roomCard != null && String.IsNullOrEmpty(roomCard.CardNumber))
{
cardNumber = Convert.ToInt32(roomCard.CardNumber);
}
stream.Write(BitConverter.GetBytes(cardNumber), 0, 4);
stream.Write(new byte[] { 0, 0 }, 0, 2);
var systemHeader = CreateSystemHeader((int)stream.Length - headerLen);
var headerData = StructConverter.StructToBytes(systemHeader);
stream.Seek(0, SeekOrigin.Begin);
stream.Write(headerData, 0, headerData.Length);
return stream.ToArray();
}
}
/// <summary>
/// 解码 InsertCardPacket
/// </summary>
/// <param name="data"></param>
/// <param name="startIndex"></param>
/// <returns></returns>
private InsertCardPacket? DecodeInsertCardPacket(byte[] data, int startIndex)
{
return StructConverter.BytesToStruct(data, startIndex, typeof(InsertCardPacket)) as InsertCardPacket?;
}
public override CommandType CommandType
{
get { return CommandType.InsertCard; }
}
}
}