766 lines
34 KiB
C#
766 lines
34 KiB
C#
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Linq;
|
|||
|
|
using System.Text;
|
|||
|
|
using System.Threading.Tasks;
|
|||
|
|
using System.Timers;
|
|||
|
|
using System.Web;
|
|||
|
|
using System.Web.Mvc;
|
|||
|
|
using System.Web.Routing;
|
|||
|
|
using Spring.Context;
|
|||
|
|
using Spring.Context.Support;
|
|||
|
|
using Spring.Web.Mvc;
|
|||
|
|
using System.Data;
|
|||
|
|
using System.Data.SqlClient;
|
|||
|
|
using System.Xml;
|
|||
|
|
using Service;
|
|||
|
|
using Domain;
|
|||
|
|
using RCUHost;
|
|||
|
|
using Common;
|
|||
|
|
using System.IO;
|
|||
|
|
using Service.Implement;
|
|||
|
|
using uPLibrary.Networking.M2Mqtt;
|
|||
|
|
using System.Net;
|
|||
|
|
using uPLibrary.Networking.M2Mqtt.Messages;
|
|||
|
|
using FluentScheduler;
|
|||
|
|
using CommonEntity;
|
|||
|
|
using WebSite.Job;
|
|||
|
|
using System.Collections.Concurrent;
|
|||
|
|
|
|||
|
|
namespace WebSite
|
|||
|
|
{
|
|||
|
|
// 注意: 有关启用 IIS6 或 IIS7 经典模式的说明,
|
|||
|
|
// 请访问 http://go.microsoft.com/?LinkId=9394801
|
|||
|
|
|
|||
|
|
public class MvcApplication : SpringMvcApplication
|
|||
|
|
{
|
|||
|
|
private readonly string currentUrl = System.Configuration.ConfigurationManager.AppSettings["CurrentUrl"];
|
|||
|
|
private readonly string code = System.Configuration.ConfigurationManager.AppSettings["code"];//需要同步PMS房态的酒店编码,多个以英文逗号隔开
|
|||
|
|
private readonly string send_to_debugger = System.Configuration.ConfigurationManager.AppSettings["send_to_debugger"];
|
|||
|
|
|
|||
|
|
private static log4net.ILog logger = log4net.LogManager.GetLogger(typeof(SpringMvcApplication));
|
|||
|
|
|
|||
|
|
public static IApplicationContext cxt = ContextRegistry.GetContext();
|
|||
|
|
public static long UDPServerErrorCount = 0;
|
|||
|
|
private IHostManager HostManager;
|
|||
|
|
private ISysHotelManager SysHotelManager;
|
|||
|
|
private IRoomStatusManager RoomStatusManager;
|
|||
|
|
private IDeviceControlReceiver DeviceControlReceiver;
|
|||
|
|
private IOverviewManager OverviewManager { get; set; }
|
|||
|
|
|
|||
|
|
public static IHostServer hostServer { get; set; }
|
|||
|
|
//private IGroupManager GroupManager;
|
|||
|
|
//private IHostRoomCardManager HostRoomCardManager;
|
|||
|
|
private syncstatus.syncstatusSoapClient _client = null;//房态同步接口
|
|||
|
|
//private ServiceReference2.ThirdpartyServiceClient _client1 = null;
|
|||
|
|
//private XR_PMS.XRHotel_ServiceSoapClient _xrClient = null;//西软pms接口
|
|||
|
|
private object _lock = new object(), _lock1 = new object();
|
|||
|
|
//private List<Host> _hosts = null;//西软pms对接使用
|
|||
|
|
|
|||
|
|
public static int TimeInterval = 10;
|
|||
|
|
public static string IntervalKey = "TimeInterval";
|
|||
|
|
/// <summary>
|
|||
|
|
/// 凌晨ECO
|
|||
|
|
/// </summary>
|
|||
|
|
public static string LingChenECO_IntervalKey = "LingChenECO_IntervalKey";
|
|||
|
|
public static string LingChenECO_MissionSysKey = "LingChenECO_MissionSysKey";
|
|||
|
|
public static string UDPLostKey = "UDPLostKey";
|
|||
|
|
public static string UDPLostIntervalKey = "UDPLostIntervalKey";
|
|||
|
|
public static string BlockLowerMachineKey = "BlockLowerMachineKey";
|
|||
|
|
|
|||
|
|
public static string ZeroX19_PassHotelCodeKey = "ZeroX19_PassHotelCode";
|
|||
|
|
|
|||
|
|
public void PreHot()
|
|||
|
|
{
|
|||
|
|
int minWorkerThreads = 32;
|
|||
|
|
int minCompletionPortThreads = 32;
|
|||
|
|
|
|||
|
|
// 设置最小线程数
|
|||
|
|
System.Threading.ThreadPool.SetMinThreads(minWorkerThreads, minCompletionPortThreads);
|
|||
|
|
|
|||
|
|
// 预热线程池
|
|||
|
|
var countdown = new System.Threading.CountdownEvent(minWorkerThreads);
|
|||
|
|
for (int i = 0; i < minWorkerThreads; i++)
|
|||
|
|
{
|
|||
|
|
System.Threading.ThreadPool.QueueUserWorkItem(_ =>
|
|||
|
|
{
|
|||
|
|
System.Threading.Thread.Sleep(100); // 模拟一点工作
|
|||
|
|
countdown.Signal();
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 等待所有预热任务完成
|
|||
|
|
countdown.Wait();
|
|||
|
|
}
|
|||
|
|
protected override void Application_Start(object sender, EventArgs e)
|
|||
|
|
{
|
|||
|
|
// 在应用程序启动时调用
|
|||
|
|
PreHot();
|
|||
|
|
log4net.Config.XmlConfigurator.Configure();//初始化log4net
|
|||
|
|
SetInitAccount();
|
|||
|
|
StartHostServer();
|
|||
|
|
//StartHostServerNew();
|
|||
|
|
BLWMQTT.StartMqtt();
|
|||
|
|
//if ("1" == send_to_debugger)
|
|||
|
|
//{
|
|||
|
|
// UDPLogServer.Init();
|
|||
|
|
// logger.Error("初始化debugger通讯");
|
|||
|
|
//}
|
|||
|
|
if (!string.IsNullOrEmpty(code))
|
|||
|
|
{
|
|||
|
|
StartTimer();
|
|||
|
|
}
|
|||
|
|
//HeartBeat();
|
|||
|
|
|
|||
|
|
|
|||
|
|
long ll1 = CSRedisCacheHelper.ForeverGet<long>(UDPLostKey);
|
|||
|
|
|
|||
|
|
System.Threading.Interlocked.Exchange(ref DataTongJi.DefineLostPackage, ll1);
|
|||
|
|
System.Threading.Interlocked.Exchange(ref DataTongJi.RecordLostPackage, 0);
|
|||
|
|
|
|||
|
|
int ll2 = CSRedisCacheHelper.ForeverGet<int>(UDPLostIntervalKey);
|
|||
|
|
if (ll2 != 0)
|
|||
|
|
{
|
|||
|
|
DataTongJi.LostPackage_Interval = ll2;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var ll3 = CSRedisCacheHelper.ForeverGet<List<string>>(ZeroX19_PassHotelCodeKey);
|
|||
|
|
if (ll3 != null)
|
|||
|
|
{
|
|||
|
|
DataTongJi.ZeroX19_PassHotelCode = new ConcurrentBag<string>(ll3);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var tq = CSRedisCacheHelper.ForeverGet<RedisTongJiData>(IntervalKey);
|
|||
|
|
if (tq == null)
|
|||
|
|
{
|
|||
|
|
RedisTongJiData tq1 = new RedisTongJiData();
|
|||
|
|
tq1.url = "api/CaiJiData";
|
|||
|
|
tq1.cron_exp = string.Format("*/{0} * * * *", 10);
|
|||
|
|
tq1.mission_key = MvcApplication.IntervalKey;
|
|||
|
|
CSRedisCacheHelper.Forever<RedisTongJiData>(IntervalKey, tq1);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var GGG = CSRedisCacheHelper.ForeverGet<ConcurrentDictionary<string, ConcurrentBag<string>>>(BlockLowerMachineKey);
|
|||
|
|
if (GGG != null)
|
|||
|
|
{
|
|||
|
|
DataTongJi.BlockLowerMachineList = GGG;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
StartCPUTongJiTask();
|
|||
|
|
|
|||
|
|
//RCUOnLineCheck();
|
|||
|
|
base.Application_Start(sender, e);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static string WanBuJianKongSourceFileName = "Para_copy.yaml";
|
|||
|
|
public static string WanBuJianKongTargetFileName = "C:\\Program Files\\windows_exporter\\textfile_inputs\\Para.prom";
|
|||
|
|
public static string JianKong_TxtData { get; set; }
|
|||
|
|
|
|||
|
|
public static System.Timers.Timer RCUOnLineTimer = null;
|
|||
|
|
public void RCUOnLineCheck()
|
|||
|
|
{
|
|||
|
|
RCUOnLineTimer = new System.Timers.Timer();
|
|||
|
|
RCUOnLineTimer.Interval = 30 * 1000;
|
|||
|
|
RCUOnLineTimer.Elapsed += new ElapsedEventHandler(OnLineCheck_Elapsed);
|
|||
|
|
RCUOnLineTimer.Start();
|
|||
|
|
}
|
|||
|
|
private void OnLineCheck_Elapsed(object sender, ElapsedEventArgs e)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
var Q = DataTongJi.ONLINERCU;
|
|||
|
|
var DT = DateTime.Now;
|
|||
|
|
var V = Q.Where(A =>
|
|||
|
|
{
|
|||
|
|
var DT_E = A.Value.CurrentDateTime;
|
|||
|
|
TimeSpan timespan = DT - DT_E;
|
|||
|
|
if (timespan.TotalSeconds > 120)
|
|||
|
|
{
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
});
|
|||
|
|
foreach (var item in V)
|
|||
|
|
{
|
|||
|
|
var IF = item.Key;
|
|||
|
|
RCUOnLineExtra N;
|
|||
|
|
Q.TryRemove(IF, out N);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
logger.Error("RCUOnLineCheck 数量统计出错了:" + ex.Message);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
#region CPU统计
|
|||
|
|
private void CPUtimer_Elapsed(object sender, ElapsedEventArgs e)
|
|||
|
|
{
|
|||
|
|
var T = sender as Timer;
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
T.Stop();
|
|||
|
|
double d = CPUData.GetCPU();
|
|||
|
|
DataTongJi.CPU_Data.Add(d);
|
|||
|
|
T.Start();
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
logger.Error("CPU 数量统计出错了:" + ex.Message);
|
|||
|
|
}
|
|||
|
|
finally
|
|||
|
|
{
|
|||
|
|
T.Start();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
public static System.Timers.Timer CPUTimer = null;
|
|||
|
|
public void StartCPUTongJiTask()
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
CPUTimer = new System.Timers.Timer();
|
|||
|
|
CPUTimer.Elapsed += new ElapsedEventHandler(CPUtimer_Elapsed);
|
|||
|
|
//10分钟统计一次
|
|||
|
|
//现在修改成20秒:
|
|||
|
|
//CPUTimer.Interval = 1 * 60 * 1000;
|
|||
|
|
CPUTimer.Interval = 1000;
|
|||
|
|
CPUTimer.Start();
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
logger.Error("StartTask Error:" + ex.Message);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region 数量统计
|
|||
|
|
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
|
|||
|
|
public void HeartBeat()
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
Timer timer = new Timer();
|
|||
|
|
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
|
|||
|
|
timer.Interval = 20000;
|
|||
|
|
timer.Start();
|
|||
|
|
}
|
|||
|
|
catch (Exception)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void timer_Elapsed(object sender, ElapsedEventArgs e)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
if (BLWMQTT.MqttClientGlobal.IsConnected)
|
|||
|
|
{
|
|||
|
|
BLWMQTT.MqttClientGlobal.Publish("blw/mqtt/heartbeat", Encoding.UTF8.GetBytes("hello beat"), MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, false);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
BLWMQTT.StartMqtt();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (Exception)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
protected void Application_End(object sender, EventArgs e)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
hostServer.Close();
|
|||
|
|
System.Threading.Thread.Sleep(5000);
|
|||
|
|
System.Net.WebRequest request = System.Net.WebRequest.Create(currentUrl);
|
|||
|
|
System.Net.WebResponse response = request.GetResponse();
|
|||
|
|
logger.Error("系统重启Web服务");
|
|||
|
|
response.Close();
|
|||
|
|
}
|
|||
|
|
catch (Exception)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
protected override void RegisterRoutes(RouteCollection routes)
|
|||
|
|
{
|
|||
|
|
routes.MapRoute(
|
|||
|
|
"Index", // 路由名称
|
|||
|
|
"Index.html", // 带有参数的 URL
|
|||
|
|
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
|
|||
|
|
);
|
|||
|
|
routes.MapRoute(
|
|||
|
|
"LogOn", // 路由名称
|
|||
|
|
"LogOn", // 带有参数的 URL
|
|||
|
|
new { controller = "Home", action = "LogOn", id = UrlParameter.Optional } // 参数默认值
|
|||
|
|
);
|
|||
|
|
routes.MapRoute(
|
|||
|
|
"chuangwei_user_login", // Route name
|
|||
|
|
"sky/api/login", // URL with parameters
|
|||
|
|
new { controller = "api", action = "login" } // Parameter defaults
|
|||
|
|
);
|
|||
|
|
routes.MapRoute(
|
|||
|
|
"chuangwei_user_refreshToken", // Route name
|
|||
|
|
"sky/api/refreshToken", // URL with parameters
|
|||
|
|
new { controller = "api", action = "refreshToken" } // Parameter defaults
|
|||
|
|
);
|
|||
|
|
routes.MapRoute(
|
|||
|
|
"chuangwei_device_control", // Route name
|
|||
|
|
"sky/api/device/control", // URL with parameters
|
|||
|
|
new { controller = "iot", action = "ChuangWei_DeviceCommandControl" } // Parameter defaults
|
|||
|
|
);
|
|||
|
|
routes.MapRoute(
|
|||
|
|
"chuangwei_hotel_info", // Route name
|
|||
|
|
"sky/api/hotel/info", // URL with parameters
|
|||
|
|
new { controller = "iot", action = "ChuangWei_HotelInfo" } // Parameter defaults
|
|||
|
|
);
|
|||
|
|
routes.MapRoute(
|
|||
|
|
"chuangwei_room_info", // Route name
|
|||
|
|
"sky/api/room/info", // URL with parameters
|
|||
|
|
new { controller = "iot", action = "ChuangWei_RoomInfo" } // Parameter defaults
|
|||
|
|
);
|
|||
|
|
routes.MapRoute(
|
|||
|
|
"chuangwei_device_info", // Route name
|
|||
|
|
"sky/api/device/info", // URL with parameters
|
|||
|
|
new { controller = "iot", action = "ChuangWei_DeviceInfo" } // Parameter defaults
|
|||
|
|
);
|
|||
|
|
routes.MapRoute(
|
|||
|
|
"chuangwei_yijiantousu", // Route name
|
|||
|
|
"sky/api/customer/complaint", // URL with parameters
|
|||
|
|
new { controller = "iot", action = "ChuangWei_TouSu" } // Parameter defaults
|
|||
|
|
);
|
|||
|
|
routes.MapRoute(
|
|||
|
|
"API", // Route name
|
|||
|
|
"sky/{controller}/{action}/{id}", // URL with parameters
|
|||
|
|
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
|
|||
|
|
);
|
|||
|
|
base.RegisterRoutes(routes);
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 设置初始账号
|
|||
|
|
/// </summary>
|
|||
|
|
private void SetInitAccount()
|
|||
|
|
{
|
|||
|
|
//初始化默认酒店
|
|||
|
|
SysHotelManager = (ISysHotelManager)cxt.GetObject("Manager.SysHotel");
|
|||
|
|
var hotel = SysHotelManager.Get(1);
|
|||
|
|
if (null == hotel)
|
|||
|
|
{
|
|||
|
|
hotel = new SysHotel
|
|||
|
|
{
|
|||
|
|
Code = "1001",
|
|||
|
|
Name = "默认酒店",
|
|||
|
|
EName = "Default Hotel",
|
|||
|
|
TWName = "默認酒店",
|
|||
|
|
Sort = 1,
|
|||
|
|
ParentID = 0,
|
|||
|
|
ActiveIndicator = true,
|
|||
|
|
CreatedBy = "System",
|
|||
|
|
CreatedDate = DateTime.Now,
|
|||
|
|
ModifiedBy = "System",
|
|||
|
|
ModifiedDate = DateTime.Now,
|
|||
|
|
ValidateDate = Convert.ToDateTime("2037-12-31"),
|
|||
|
|
SysHotelGroup = new SysHotelGroup { ID = 1, Parent = null, Name = "酒店", Sort = 1 }
|
|||
|
|
};
|
|||
|
|
SysHotelManager.Save(hotel);
|
|||
|
|
}
|
|||
|
|
//初始化默认酒店超级管理员角色
|
|||
|
|
ISysRoleManager roleManager = (ISysRoleManager)cxt.GetObject("Manager.SysRole");
|
|||
|
|
var role = roleManager.Get(1);
|
|||
|
|
if (null == role)
|
|||
|
|
{
|
|||
|
|
role = new SysRole
|
|||
|
|
{
|
|||
|
|
Name = "Administrator",
|
|||
|
|
Sort = 1,
|
|||
|
|
ActiveIndicator = true,
|
|||
|
|
CreatedBy = "System",
|
|||
|
|
CreatedDate = DateTime.Now,
|
|||
|
|
ModifiedBy = "System",
|
|||
|
|
ModifiedDate = DateTime.Now,
|
|||
|
|
HotelID = 1,
|
|||
|
|
SysHotelGroup = new SysHotelGroup { ID = 1 },
|
|||
|
|
};
|
|||
|
|
roleManager.Save(role);
|
|||
|
|
}
|
|||
|
|
//初始化admin账号
|
|||
|
|
ISysUserManager manger = (ISysUserManager)cxt.GetObject("Manager.SysUser");
|
|||
|
|
const string account = "admin";
|
|||
|
|
var user = manger.Get(account);
|
|||
|
|
if (user == null)
|
|||
|
|
{
|
|||
|
|
IList<SysHotel> hotels = new List<SysHotel>();
|
|||
|
|
hotels.Add(SysHotelManager.Get(1));
|
|||
|
|
user = new SysUsers
|
|||
|
|
{
|
|||
|
|
Account = account,
|
|||
|
|
Name = account,
|
|||
|
|
Role = new SysRole { ID = 1 },
|
|||
|
|
Group = new Group { ID = 1 },
|
|||
|
|
SysHotelGroup = new SysHotelGroup { ID = 1 },
|
|||
|
|
Hotels = hotels,
|
|||
|
|
HotelID = 1,
|
|||
|
|
ActiveIndicator = true,
|
|||
|
|
CreatedBy = "System",
|
|||
|
|
CreatedDate = DateTime.Now,
|
|||
|
|
ModifiedBy = "System",
|
|||
|
|
ModifiedDate = DateTime.Now
|
|||
|
|
};
|
|||
|
|
manger.Save(user);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void StartHostServerNew()
|
|||
|
|
{
|
|||
|
|
hostServer = new RCUHost.Implement.HostServer();
|
|||
|
|
hostServer.AddReceiver(new RCUHost.Implement.HeartReceiver());
|
|||
|
|
hostServer.AddReceiver(new RCUHost.Implement.HostSearchReceiver());
|
|||
|
|
hostServer.AddReceiver(new RCUHost.Implement.RoomCardReceiver());
|
|||
|
|
hostServer.AddReceiver(new RCUHost.Implement.UpdateHostReceiver());
|
|||
|
|
hostServer.AddReceiver(new RCUHost.Implement.UpdateHostFTPReceiver());
|
|||
|
|
hostServer.AddReceiver(new RCUHost.Implement.UploadCurrentVersionReceiver());
|
|||
|
|
hostServer.AddReceiver(new RCUHost.Implement.SyncTimeReceiver());
|
|||
|
|
hostServer.AddReceiver(new RCUHost.Implement.RoomStatusReceiver());
|
|||
|
|
hostServer.AddReceiver(new RCUHost.Implement.HostSecretReceiver());
|
|||
|
|
hostServer.AddReceiver(new RCUHost.Implement.WordsReportReceiver());
|
|||
|
|
hostServer.AddReceiver(new RCUHost.Implement.HostRegisterReceiver());
|
|||
|
|
hostServer.AddReceiver(new RCUHost.Implement.ExplainDomainIPReceiver());
|
|||
|
|
|
|||
|
|
//阿宝添加的
|
|||
|
|
hostServer.AddReceiver(new RCUHost.Implement.TFTPReceiver());
|
|||
|
|
hostServer.AddReceiver(new RCUHost.Implement.TFTPSettingReceiver());
|
|||
|
|
hostServer.AddReceiver(new RCUHost.Implement.UpgradeProgressBar());
|
|||
|
|
hostServer.AddReceiver(new RCUHost.Implement.RoomStatusChangedReceiver());
|
|||
|
|
hostServer.AddReceiver(new RCUHost.Implement.AskRoomStatusChangedReceiver());
|
|||
|
|
hostServer.AddReceiver((IReceiver)new RCUHost.Implement.New_RoomStatusReceiver());
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 创建 HostServer 以便与下位机通信
|
|||
|
|
/// </summary>
|
|||
|
|
public static void StartHostServer()
|
|||
|
|
{
|
|||
|
|
//创建 HostServer
|
|||
|
|
hostServer = (IHostServer)cxt.GetObject("RCUHost.HostServer");
|
|||
|
|
//加载 Receiver, 只有加载对应的Receiver管理软件才能接收对应主机上报的命令
|
|||
|
|
hostServer.AddReceiver((IReceiver)cxt.GetObject("RCUHost.HeartReceiver"));
|
|||
|
|
hostServer.AddReceiver((IReceiver)cxt.GetObject("RCUHost.HostSearchReceiver"));
|
|||
|
|
hostServer.AddReceiver((IReceiver)cxt.GetObject("RCUHost.RoomCardReceiver"));
|
|||
|
|
hostServer.AddReceiver((IReceiver)cxt.GetObject("RCUHost.UpdateHostReceiver"));
|
|||
|
|
hostServer.AddReceiver((IReceiver)cxt.GetObject("RCUHost.UpdateHostFTPReceiver"));
|
|||
|
|
hostServer.AddReceiver((IReceiver)cxt.GetObject("RCUHost.UploadCurrentVersionReceiver"));
|
|||
|
|
hostServer.AddReceiver((IReceiver)cxt.GetObject("RCUHost.SyncTimeReceiver"));
|
|||
|
|
hostServer.AddReceiver((IReceiver)cxt.GetObject("RCUHost.RoomStatusReceiver"));
|
|||
|
|
hostServer.AddReceiver((IReceiver)cxt.GetObject("RCUHost.HostSecretReceiver"));
|
|||
|
|
hostServer.AddReceiver((IReceiver)cxt.GetObject("RCUHost.WordsReportReceiver"));
|
|||
|
|
hostServer.AddReceiver((IReceiver)cxt.GetObject("RCUHost.HostRegisterReceiver"));
|
|||
|
|
//hostServer.AddReceiver((IReceiver)cxt.GetObject("RCUHost.UpdateConfigReceiver"));
|
|||
|
|
//hostServer.AddReceiver((IReceiver)cxt.GetObject("RCUHost.UpdateRCUFileReceiver"));
|
|||
|
|
//hostServer.AddReceiver((IReceiver)cxt.GetObject("RCUHost.DeviceControlReceiver"));
|
|||
|
|
hostServer.AddReceiver((IReceiver)cxt.GetObject("RCUHost.ExplainDomainIPReceiver"));
|
|||
|
|
//阿宝添加的
|
|||
|
|
hostServer.AddReceiver((IReceiver)cxt.GetObject("RCUHost.TFTPReceiver"));
|
|||
|
|
hostServer.AddReceiver((IReceiver)cxt.GetObject("RCUHost.TFTPSettingReceiver"));
|
|||
|
|
hostServer.AddReceiver((IReceiver)cxt.GetObject("RCUHost.UpgradeProgressBar"));
|
|||
|
|
//hostServer.AddReceiver((IReceiver)cxt.GetObject("RCUHost.HotelTimeReceiver"));
|
|||
|
|
hostServer.AddReceiver((IReceiver)cxt.GetObject("RCUHost.RoomStatusChangedReceiver"));
|
|||
|
|
hostServer.AddReceiver((IReceiver)cxt.GetObject("RCUHost.AskRoomStatusChangedReceiver"));
|
|||
|
|
|
|||
|
|
hostServer.AddReceiver((IReceiver)cxt.GetObject("RCUHost.New_RoomStatusReceiver"));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 启动定时器
|
|||
|
|
/// </summary>
|
|||
|
|
private void StartTimer()
|
|||
|
|
{
|
|||
|
|
HostManager = (IHostManager)cxt.GetObject("Manager.Host");
|
|||
|
|
RoomStatusManager = (IRoomStatusManager)cxt.GetObject("Manager.RoomStatus");
|
|||
|
|
DeviceControlReceiver = (IDeviceControlReceiver)cxt.GetObject("RCUHost.DeviceControlReceiver");
|
|||
|
|
OverviewManager = (IOverviewManager)cxt.GetObject("Manager.Overview");
|
|||
|
|
_client = new syncstatus.syncstatusSoapClient();
|
|||
|
|
|
|||
|
|
Timer timer2 = new Timer(20000);//每20秒扫描一次
|
|||
|
|
timer2.Elapsed += new ElapsedEventHandler(syncRoomStatusCallback);//定时同步PMS房态
|
|||
|
|
timer2.Enabled = true;
|
|||
|
|
timer2.AutoReset = true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
protected void Session_Start()
|
|||
|
|
{
|
|||
|
|
if (this.Request.UserLanguages == null || this.Request.UserLanguages.Length < 1 ||
|
|||
|
|
(!string.IsNullOrEmpty(this.Request.UserLanguages[0]) && this.Request.UserLanguages[0].ToLower().StartsWith("zh")))
|
|||
|
|
{
|
|||
|
|
this.Session["isCN"] = 0;
|
|||
|
|
HttpCookie isCNCookie = new HttpCookie("isCN");
|
|||
|
|
isCNCookie.Value = "zh-cn";
|
|||
|
|
isCNCookie.Expires = DateTime.Now.AddYears(1);
|
|||
|
|
Response.Cookies.Add(isCNCookie);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
protected void Session_End(object sender, EventArgs e)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void syncRoomStatusCallback(object sender, ElapsedEventArgs e)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
RCUHost.TimingHelper.HostTimingControlHelper.HostTimingControl(DeviceControlReceiver);//定时控制
|
|||
|
|
DateTime now = DateTime.Now;
|
|||
|
|
if (now.Hour == 00 && now.Minute == 00 && now.Second < 20)
|
|||
|
|
{
|
|||
|
|
//UploadHostAbnormalRecords();
|
|||
|
|
}
|
|||
|
|
DataSet dsHotel = _client.GetHotelCode();
|
|||
|
|
lock (_lock1)
|
|||
|
|
{
|
|||
|
|
foreach (DataRow row in dsHotel.Tables[0].Rows)
|
|||
|
|
{
|
|||
|
|
if (Convert.ToInt16(row["HotelID"]) > 0)
|
|||
|
|
{
|
|||
|
|
DataSet ds = _client.GetCheckInOrOutRecord(row["Code"].ToString());
|
|||
|
|
if (ds != null && ds.Tables.Count > 2 && ds.Tables[3].Rows.Count > 0)
|
|||
|
|
{
|
|||
|
|
int hotelID = Convert.ToInt16(ds.Tables[3].Rows[0]["HotelID"].ToString());//与PMS同步接口所配置的HotelID
|
|||
|
|
if (hotelID > 0)
|
|||
|
|
{
|
|||
|
|
foreach (DataRow dr in ds.Tables[0].Rows)
|
|||
|
|
{
|
|||
|
|
var q = RoomStatusManager.Get(2);
|
|||
|
|
SyncRoomStatus(hotelID, dr, q, 0);//更新出租房态
|
|||
|
|
}
|
|||
|
|
foreach (DataRow dr in ds.Tables[1].Rows)
|
|||
|
|
{
|
|||
|
|
var q = RoomStatusManager.Get(8);
|
|||
|
|
SyncRoomStatus(hotelID, dr, q, 1);//更新退房房态
|
|||
|
|
}
|
|||
|
|
foreach (DataRow dr in ds.Tables[2].Rows)
|
|||
|
|
{
|
|||
|
|
var q = RoomStatusManager.Get(4);
|
|||
|
|
SyncRoomStatus(hotelID, dr, q, 2);//更新待租房态
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//logger.Error(string.Format("酒店({0})已同步房态", row["Code"].ToString() + row["Remark"].ToString()));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#region 跟第三方同步(已注释)
|
|||
|
|
/*try
|
|||
|
|
{
|
|||
|
|
//跟西软pms同步房态
|
|||
|
|
if (_xrClient != null && _hosts != null && _hosts.Count > 0)
|
|||
|
|
{
|
|||
|
|
XmlDocument xmlXRRoomStatus = new XmlDocument();
|
|||
|
|
xmlXRRoomStatus.LoadXml(_xrClient.Roomview("", "", ""));
|
|||
|
|
XmlNodeList list = xmlXRRoomStatus.SelectSingleNode("interface").ChildNodes;
|
|||
|
|
if (list.Count > 0)
|
|||
|
|
{
|
|||
|
|
List<string> lstRooms = new List<string>() { };
|
|||
|
|
foreach (Host host in _hosts)
|
|||
|
|
{
|
|||
|
|
foreach (XmlNode node in list)
|
|||
|
|
{
|
|||
|
|
if (node["roomno"] != null && node["roomno"].InnerText == host.RoomNumber)
|
|||
|
|
{
|
|||
|
|
int roomStatusID = 16;//空房
|
|||
|
|
switch (Convert.ToInt16(node["roomstate"].InnerText))
|
|||
|
|
{
|
|||
|
|
case 1://空净房
|
|||
|
|
roomStatusID = 4;//待租
|
|||
|
|
break;
|
|||
|
|
case 2://空脏房
|
|||
|
|
roomStatusID = 8;//退房
|
|||
|
|
break;
|
|||
|
|
case 3://住净房
|
|||
|
|
case 4://住脏房
|
|||
|
|
roomStatusID = 2;//出租
|
|||
|
|
break;
|
|||
|
|
//case 5://维修房
|
|||
|
|
//case 6://临时房态(酒店自定义)
|
|||
|
|
}
|
|||
|
|
if (host.RoomStatus.ID != roomStatusID)
|
|||
|
|
{
|
|||
|
|
HostManager.ChangeRoomStatus(host, RoomStatusManager.Get(roomStatusID));
|
|||
|
|
lstRooms.Add(host.RoomNumber);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (lstRooms.Count > 0)
|
|||
|
|
{
|
|||
|
|
logger.Error(string.Format("本次酒店(1099珠海度假村千禧宫)同步西软pms客房房态有:{0}", string.Join(",", lstRooms)));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
logger.Error("本次酒店(1099珠海度假村千禧宫)同步西软pms客房房态失败。原因:" + ex.ToString());
|
|||
|
|
}*/
|
|||
|
|
|
|||
|
|
//判断已插卡取电但尚未开房5分钟后,上报报警数据给金天鹅PMS
|
|||
|
|
/*Group group = GroupManager.Load(21);
|
|||
|
|
IList<Host> hosts = HostManager.LoadAll(group);
|
|||
|
|
foreach (Host host in hosts)
|
|||
|
|
{
|
|||
|
|
IList<HostRoomCard> hostRoomCards = HostRoomCardManager.LoadAll(host.RoomNumber, "");
|
|||
|
|
if (hostRoomCards != null && hostRoomCards.Count > 0)
|
|||
|
|
{
|
|||
|
|
XmlDocument xmlDoc = new XmlDocument();
|
|||
|
|
xmlDoc.LoadXml(_client1.GethHotelcode("宝来客控对接酒店"));
|
|||
|
|
XmlElement element = xmlDoc.DocumentElement;
|
|||
|
|
string hotelCode = element.GetElementsByTagName("Body")[0].ChildNodes[0].ChildNodes[0].InnerText;//"HOTEL1489374686";
|
|||
|
|
xmlDoc = new XmlDocument();
|
|||
|
|
XmlNode node = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", "");//创建类型声明节点
|
|||
|
|
xmlDoc.AppendChild(node);
|
|||
|
|
XmlNode root = xmlDoc.CreateElement("request");
|
|||
|
|
xmlDoc.AppendChild(root);
|
|||
|
|
XmlNode card = xmlDoc.CreateElement("Alarm");
|
|||
|
|
root.AppendChild(card);
|
|||
|
|
XmlNode data = xmlDoc.CreateNode(XmlNodeType.Element, "hotelCode", null);
|
|||
|
|
data.InnerText = hotelCode;//酒店代码
|
|||
|
|
card.AppendChild(data);
|
|||
|
|
data = xmlDoc.CreateNode(XmlNodeType.Element, "roomno", null);
|
|||
|
|
data.InnerText = host.RoomNumber;//房间号
|
|||
|
|
card.AppendChild(data);
|
|||
|
|
data = xmlDoc.CreateNode(XmlNodeType.Element, "remark", null);
|
|||
|
|
data.InnerText = "";//备注
|
|||
|
|
card.AppendChild(data);
|
|||
|
|
data = xmlDoc.CreateNode(XmlNodeType.Element, "state", null);
|
|||
|
|
|
|||
|
|
HostRoomCard hostRoomCard = hostRoomCards[hostRoomCards.Count - 1];
|
|||
|
|
|
|||
|
|
if (host.RoomStatus.ID != 2 && host.RoomCard != null)
|
|||
|
|
{
|
|||
|
|
if ((hostRoomCard.IsAlarm == null || hostRoomCard.IsAlarm == false) &&
|
|||
|
|
Convert.ToDateTime(hostRoomCard.InCardTime).AddMinutes(5) <= DateTime.Now)
|
|||
|
|
{
|
|||
|
|
data.InnerText = "1";//报警
|
|||
|
|
card.AppendChild(data);
|
|||
|
|
data = xmlDoc.CreateNode(XmlNodeType.Element, "key", null);
|
|||
|
|
data.InnerText = "Wide_Third";//授权码
|
|||
|
|
card.AppendChild(data);
|
|||
|
|
//string result = _client1.send(xmlDoc.InnerXml);
|
|||
|
|
logger.Error(xmlDoc.InnerXml);//result + Environment.NewLine +
|
|||
|
|
|
|||
|
|
hostRoomCard.IsAlarm = true;
|
|||
|
|
HostRoomCardManager.Update(hostRoomCard);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (hostRoomCard.IsAlarm == true)
|
|||
|
|
{
|
|||
|
|
data.InnerText = "0";//取消报警
|
|||
|
|
card.AppendChild(data);
|
|||
|
|
data = xmlDoc.CreateNode(XmlNodeType.Element, "key", null);
|
|||
|
|
data.InnerText = "Wide_Third";//授权码
|
|||
|
|
card.AppendChild(data);
|
|||
|
|
//string result = _client1.send(xmlDoc.InnerXml);
|
|||
|
|
logger.Error(xmlDoc.InnerXml);//result + Environment.NewLine +
|
|||
|
|
|
|||
|
|
hostRoomCard.IsAlarm = false;
|
|||
|
|
HostRoomCardManager.Update(hostRoomCard);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}*/
|
|||
|
|
#endregion
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
logger.Error("定时同步房态异常。原因:" + ex.ToString());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 同步房态
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="hotelID">酒店ID</param>
|
|||
|
|
/// <param name="dr"></param>
|
|||
|
|
/// <param name="roomStatus">房态</param>
|
|||
|
|
/// <param name="flag">更新字段标记</param>
|
|||
|
|
private void SyncRoomStatus(int hotelID, DataRow dr, RoomStatus roomStatus, int flag)
|
|||
|
|
{
|
|||
|
|
_client.UpdateCheckInOrOutRecord(dr["Code"].ToString(), Convert.ToInt64(dr["ID"]), flag);//更新已同步状态
|
|||
|
|
|
|||
|
|
string RoomNUM = dr["RoomNumber"].ToString();
|
|||
|
|
var T = new Tuple<int, string,RoomStatus>(hotelID,RoomNUM,roomStatus);
|
|||
|
|
Task.Factory.StartNew((state) =>
|
|||
|
|
{
|
|||
|
|
var T1 = state as Tuple<int, string,RoomStatus>;
|
|||
|
|
Host host = HostManager.GetByRoomNumber(T1.Item2, T1.Item1);
|
|||
|
|
if (host != null)
|
|||
|
|
{
|
|||
|
|
HostManager.ChangeRoomStatus(host, T1.Item3);
|
|||
|
|
string Key = CacheKey.SyncRoomStatus + "_" + host.HostNumber;
|
|||
|
|
RoomStatusRequest ddd = new RoomStatusRequest();
|
|||
|
|
ddd.HostNumber = host.HostNumber;
|
|||
|
|
ddd.MAC = host.MAC;
|
|||
|
|
ddd.Status = T1.Item3;
|
|||
|
|
CSRedisCacheHelper.Set_PartitionWithForever<RoomStatusRequest>(Key, ddd);
|
|||
|
|
}
|
|||
|
|
},T);
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 定时上报主机异常记录
|
|||
|
|
/// </summary>
|
|||
|
|
private void UploadHostAbnormalRecords()
|
|||
|
|
{
|
|||
|
|
Task.Factory.StartNew(() =>
|
|||
|
|
{
|
|||
|
|
List<SysHotel> lstHotels = SysHotelManager.LoadAll().Where(r => !string.IsNullOrEmpty(r.FaultPushURL)).ToList();// && r.FaultPushURL.ToLower().IndexOf("iot.sditcn.com") > -1).ToList();//PDU上报
|
|||
|
|
foreach (SysHotel hotel in lstHotels)
|
|||
|
|
{
|
|||
|
|
for (int i = 1; i < 4; i++)
|
|||
|
|
{
|
|||
|
|
System.Data.DataTable dt = OverviewManager.LoadHostAbnormalRecords(i, hotel.ID);//三种异常类型
|
|||
|
|
XuanZhuResponse resp;
|
|||
|
|
foreach (System.Data.DataRow dr in dt.Rows)
|
|||
|
|
{
|
|||
|
|
resp = new XuanZhuResponse();
|
|||
|
|
resp.code = hotel.Code;
|
|||
|
|
resp.roomNumber = dr["RoomNumber"].ToString();
|
|||
|
|
resp.address = "";
|
|||
|
|
resp.name = dr["AbnormalName"].ToString();
|
|||
|
|
resp.status = 2;
|
|||
|
|
resp.faultType = 1;
|
|||
|
|
resp.faultData = 1;
|
|||
|
|
XuanZhuOperation.ReportService(hotel.FaultPushURL, resp);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
logger.Error(string.Format("定时上报酒店({0})主机异常记录", hotel.Code));
|
|||
|
|
}
|
|||
|
|
}, System.Threading.CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default);
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 获取当前登录帐号
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
//private IList<WebSite.Models.ActiveUserModel> GetActiveUsers()
|
|||
|
|
//{
|
|||
|
|
// var activeUsers = Application["ActiveUsers"] as List<WebSite.Models.ActiveUserModel>;
|
|||
|
|
// if (activeUsers == null)
|
|||
|
|
// {
|
|||
|
|
// activeUsers = new List<WebSite.Models.ActiveUserModel>();
|
|||
|
|
// Application["ActiveUsers"] = activeUsers;
|
|||
|
|
// }
|
|||
|
|
// return activeUsers;
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|