|
@@ -11,8 +11,10 @@ namespace centralController.WebServer
|
|
|
{
|
|
|
class MyWebServer : IWebServer
|
|
|
{
|
|
|
- private Queue<MessageUTF8> reserveQueue = null;
|
|
|
- private object reserveLock = new object();
|
|
|
+ private Queue<MessageUTF8> waitToReserveQueue = null;
|
|
|
+ private Queue<MessageUTF8> reservedQueue = null;
|
|
|
+ private object waitToReserveLock = new object();
|
|
|
+ private object reservedLock = new object();
|
|
|
private Communication comm = null;
|
|
|
private Thread receiveMsg = null;
|
|
|
private bool isClosing { get; set; }
|
|
@@ -39,17 +41,33 @@ namespace centralController.WebServer
|
|
|
{
|
|
|
string vehicleUpdateSql = "";
|
|
|
string vehicleInsertSql = "";
|
|
|
- if (state >= 0)
|
|
|
+ if (orderRecordsID > 0)
|
|
|
{
|
|
|
- vehicleUpdateSql = "update vehicle set vehiclepParkState = " + state + " ,orderRecordsID = " + orderRecordsID + " where numberPlate = '" + license + "';";
|
|
|
- vehicleInsertSql = "insert into vehicle (numberPlate,vehiclepParkState,orderRecordsID) values " +
|
|
|
- "('" + license + "'," + state + "," + orderRecordsID + ");";
|
|
|
+ if (state >= 0)
|
|
|
+ {
|
|
|
+ vehicleUpdateSql = "update vehicle set vehiclepParkState = " + state + " ,orderRecordsID = " + orderRecordsID + " where numberPlate = '" + license + "';";
|
|
|
+ vehicleInsertSql = "insert into vehicle (numberPlate,vehiclepParkState,orderRecordsID) values " +
|
|
|
+ "('" + license + "'," + state + "," + orderRecordsID + ");";
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ vehicleUpdateSql = "update vehicle set orderRecordsID = " + orderRecordsID + " where numberPlate = '" + license + "';";
|
|
|
+ vehicleInsertSql = "insert into vehicle (numberPlate,orderRecordsID) values " +
|
|
|
+ "('" + license + "'," + orderRecordsID + ");";
|
|
|
+ }
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- vehicleUpdateSql = "update vehicle set orderRecordsID = " + orderRecordsID + " where numberPlate = '" + license + "';";
|
|
|
- vehicleInsertSql = "insert into vehicle (numberPlate,orderRecordsID) values " +
|
|
|
- "('" + license + "'," + orderRecordsID + ");";
|
|
|
+ if (state >= 0)
|
|
|
+ {
|
|
|
+ vehicleUpdateSql = "update vehicle set vehiclepParkState = " + state + " where numberPlate = '" + license + "';";
|
|
|
+ vehicleInsertSql = "insert into vehicle (numberPlate,vehiclepParkState) values " +
|
|
|
+ "('" + license + "'," + state + ");";
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
}
|
|
|
List<string> vehicleUpdateList = new List<string>();
|
|
|
List<string> vehicleInsertList = new List<string>();
|
|
@@ -79,7 +97,7 @@ namespace centralController.WebServer
|
|
|
}
|
|
|
}
|
|
|
/// <summary>
|
|
|
- /// 预约数据库操作
|
|
|
+ /// 插入预约记录
|
|
|
/// </summary>
|
|
|
/// <param name="localDB"></param>
|
|
|
/// <param name="userID"></param>
|
|
@@ -88,9 +106,9 @@ namespace centralController.WebServer
|
|
|
/// <param name="orderTime"></param>
|
|
|
/// <param name="orderLength"></param>
|
|
|
/// <returns></returns>
|
|
|
- private bool OrderDBOperation(bool localDB, string userID, bool parking, string license, string orderTime, int orderLength)
|
|
|
+ private bool InsertOrderRecord(bool localDB, string userID, bool parking, string license, string orderTime, int orderLength)
|
|
|
{
|
|
|
- //预约记录插入db
|
|
|
+ bool result = false;
|
|
|
string orderRecordInsertSql;
|
|
|
if (parking)
|
|
|
{
|
|
@@ -105,22 +123,58 @@ namespace centralController.WebServer
|
|
|
List<string> orderList = new List<string>();
|
|
|
orderList.Add(orderRecordInsertSql);
|
|
|
if (localDB)
|
|
|
- Monitor.Monitor.localDBOper.Insert(orderList);
|
|
|
+ result = Monitor.Monitor.localDBOper.Insert(orderList);
|
|
|
else
|
|
|
- Monitor.Monitor.remoteDBOper.Insert(orderList);
|
|
|
- //查询预约记录id号
|
|
|
+ result = Monitor.Monitor.remoteDBOper.Insert(orderList);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ /// <summary>
|
|
|
+ /// 找到当前预约记录ID
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="localDB"></param>
|
|
|
+ /// <param name="license"></param>
|
|
|
+ /// <param name="latestIndex">最近第几条记录,1表示最新一条</param>
|
|
|
+ /// <returns></returns>
|
|
|
+ private int FindCurrentOrderRecordID(bool localDB, string license,int latestIndex = 1)
|
|
|
+ {
|
|
|
int currentID = 0;
|
|
|
List<object[]> orderRecords = Monitor.Monitor.GetOrderRecords(localDB, license, DateTime.Now.ToString("yyyy-MM-dd"), DateTime.Now.AddDays(1).ToString("yyyy-MM-dd"));
|
|
|
if (orderRecords.Count != 0)
|
|
|
{
|
|
|
- currentID = (int)(UInt32)orderRecords[0][0];
|
|
|
+ try
|
|
|
+ {
|
|
|
+ currentID = (int)(UInt32)orderRecords[latestIndex-1][0];
|
|
|
+ }
|
|
|
+ catch { }
|
|
|
}
|
|
|
- else { /*反馈web,预约失败*/ return false; }
|
|
|
+ return currentID;
|
|
|
+ }
|
|
|
+ /// <summary>
|
|
|
+ /// 预约数据库操作
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="localDB"></param>
|
|
|
+ /// <param name="userID"></param>
|
|
|
+ /// <param name="parking"></param>
|
|
|
+ /// <param name="license"></param>
|
|
|
+ /// <param name="orderTime"></param>
|
|
|
+ /// <param name="orderLength"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ private bool ReserveDBOperation(bool localDB, string userID, bool parking, string license, string orderTime, int orderLength)
|
|
|
+ {
|
|
|
+ //预约记录插入db
|
|
|
+ InsertOrderRecord(localDB, userID, parking, license, orderTime, orderLength);
|
|
|
+ //查询预约记录id号
|
|
|
+ int currentID = FindCurrentOrderRecordID(localDB, license);
|
|
|
+ if(currentID == 0){ /*反馈web,预约失败*/ return false; }
|
|
|
//更新车辆状态
|
|
|
UpdateVehicleState(localDB, parking ? 4 : 5, currentID, license);
|
|
|
return true;
|
|
|
}
|
|
|
-
|
|
|
+ /// <summary>
|
|
|
+ /// 检查预约指令是否可行
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="msg"></param>
|
|
|
+ /// <returns></returns>
|
|
|
private bool ReservationValidate(MessageUTF8 msg)
|
|
|
{
|
|
|
//可预约车位总数
|
|
@@ -133,9 +187,9 @@ namespace centralController.WebServer
|
|
|
end = start.AddHours(msg.bookLength);
|
|
|
}
|
|
|
catch { return false; }
|
|
|
- lock (reserveLock)
|
|
|
+ lock (waitToReserveLock)
|
|
|
{
|
|
|
- Queue<MessageUTF8>.Enumerator enumer = reserveQueue.GetEnumerator();
|
|
|
+ Queue<MessageUTF8>.Enumerator enumer = waitToReserveQueue.GetEnumerator();
|
|
|
while (enumer.MoveNext())
|
|
|
{
|
|
|
DateTime tempStart, tempEnd;
|
|
@@ -145,7 +199,7 @@ namespace centralController.WebServer
|
|
|
tempEnd = start.AddHours(enumer.Current.bookLength);
|
|
|
}
|
|
|
catch { return false; }
|
|
|
- if(!((tempStart-end).TotalMinutes>0 || (start - tempEnd).TotalMinutes > 0)) { count += 1; }
|
|
|
+ if (!((tempStart - end).TotalMinutes > 0 || (start - tempEnd).TotalMinutes > 0)) { count += 1; }
|
|
|
}
|
|
|
}
|
|
|
if (allBookableSpace >= count)
|
|
@@ -153,7 +207,10 @@ namespace centralController.WebServer
|
|
|
else
|
|
|
return true;
|
|
|
}
|
|
|
-
|
|
|
+ /// <summary>
|
|
|
+ /// 根据消息类型分别处理
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="msg"></param>
|
|
|
private void MsgHandling(MessageUTF8 msg)
|
|
|
{
|
|
|
try
|
|
@@ -162,17 +219,25 @@ namespace centralController.WebServer
|
|
|
{
|
|
|
//预约停
|
|
|
case "RESERVE":
|
|
|
- lock (reserveLock)
|
|
|
+ if (!ReservationValidate(msg))
|
|
|
{
|
|
|
- reserveQueue.Enqueue(msg);
|
|
|
+ //回复预约失败给web
|
|
|
+ msg.cmd = "FAILED";
|
|
|
+ comm.SendMessage(msg);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ lock (waitToReserveLock)
|
|
|
+ {
|
|
|
+ waitToReserveQueue.Enqueue(msg);
|
|
|
+ }
|
|
|
+ //预约记录与车辆状态写入数据库
|
|
|
+ ReserveDBOperation(true, msg.sender, true, msg.context, msg.bookTime, msg.bookLength);
|
|
|
+ ReserveDBOperation(false, msg.sender, true, msg.context, msg.bookTime, msg.bookLength);
|
|
|
+ //回复成功给web
|
|
|
+ msg.cmd = "0";
|
|
|
+ comm.SendMessage(msg);
|
|
|
}
|
|
|
- //预约记录与车辆状态写入数据库
|
|
|
- OrderDBOperation(true, msg.sender, true, msg.context, msg.bookTime, 3);
|
|
|
- OrderDBOperation(false, msg.sender, true, msg.context, msg.bookTime, 3);
|
|
|
- //回复给web
|
|
|
-
|
|
|
- msg.cmd = "0";
|
|
|
- comm.SendMessage(msg);
|
|
|
break;
|
|
|
//预约取
|
|
|
case "PREFETCH":
|
|
@@ -208,6 +273,65 @@ namespace centralController.WebServer
|
|
|
catch (Exception ex) { Console.WriteLine("收消息," + ex.Message + "\n" + ex.StackTrace); }
|
|
|
}
|
|
|
/// <summary>
|
|
|
+ /// 根据时间段处理所有准备预约及已预约指令
|
|
|
+ /// </summary>
|
|
|
+ private void ReserveMsgHandling()
|
|
|
+ {
|
|
|
+ while (!isClosing)
|
|
|
+ {
|
|
|
+ //处理准备预约指令队列
|
|
|
+ lock (waitToReserveLock)
|
|
|
+ {
|
|
|
+ for (int i = 0; i < waitToReserveQueue.Count; i++)
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ MessageUTF8 msg = waitToReserveQueue.Dequeue();
|
|
|
+ DateTime startTime = DateTime.Parse(msg.bookTime);
|
|
|
+ TimeSpan ts = DateTime.Now - startTime;
|
|
|
+ //达到预约启动时间,放入已预约队列
|
|
|
+ if (ts.TotalMinutes >= 0)
|
|
|
+ {
|
|
|
+ //通知PLC减少一个可预约车位数
|
|
|
+ lock (reservedLock)
|
|
|
+ {
|
|
|
+ reservedQueue.Enqueue(msg);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //还未达到启动时间
|
|
|
+ else
|
|
|
+ {
|
|
|
+ waitToReserveQueue.Enqueue(msg);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ catch { }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ lock (reservedLock)
|
|
|
+ {
|
|
|
+ for (int i = 0; i < reservedQueue.Count; i++)
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ MessageUTF8 msg = reservedQueue.Dequeue();
|
|
|
+ DateTime startTime = DateTime.Parse(msg.bookTime);
|
|
|
+ TimeSpan ts = DateTime.Now - startTime;
|
|
|
+ //预约超时
|
|
|
+ if (ts.TotalMinutes > msg.bookLength * 60)
|
|
|
+ {
|
|
|
+ //通知PLC将可预约车位数恢复一个
|
|
|
+ //恢复车辆状态
|
|
|
+ UpdateVehicleState(true, 0, 0, msg.context);
|
|
|
+ UpdateVehicleState(false, 0, 0, msg.context);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ catch { }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Thread.Sleep(5000);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /// <summary>
|
|
|
/// 启动消息接收,启动超时指令处理
|
|
|
/// </summary>
|
|
|
/// <param name="port"></param>
|
|
@@ -215,12 +339,13 @@ namespace centralController.WebServer
|
|
|
public bool Start(int port)
|
|
|
{
|
|
|
isClosing = false;
|
|
|
- reserveQueue = new Queue<MessageUTF8>();
|
|
|
+ waitToReserveQueue = new Queue<MessageUTF8>();
|
|
|
+ reservedQueue = new Queue<MessageUTF8>();
|
|
|
//MessageUTF8 message = new MessageUTF8();
|
|
|
//message.context = "sending message test";
|
|
|
//message.cmd = "S";
|
|
|
//message.parkingRecordsID = 1;
|
|
|
-
|
|
|
+ //持续进行连接尝试
|
|
|
Task.Factory.StartNew(() =>
|
|
|
{
|
|
|
//初始化后与web持续连接
|
|
@@ -305,43 +430,16 @@ namespace centralController.WebServer
|
|
|
}
|
|
|
});
|
|
|
receiveMsg.Start();
|
|
|
- //处理超时预约指令
|
|
|
+ //根据所处时间段处理预约指令
|
|
|
Task.Factory.StartNew(() =>
|
|
|
{
|
|
|
- while (!isClosing)
|
|
|
- {
|
|
|
- lock (reserveLock)
|
|
|
- {
|
|
|
- for (int i = 0; i < reserveQueue.Count; i++)
|
|
|
- {
|
|
|
- try
|
|
|
- {
|
|
|
- MessageUTF8 msg = reserveQueue.Dequeue();
|
|
|
- DateTime startTime = DateTime.Parse(msg.bookTime);
|
|
|
- TimeSpan ts = DateTime.Now - startTime;
|
|
|
- if (ts.TotalMinutes > msg.bookLength * 60)
|
|
|
- {
|
|
|
- //通知PLC将可预约车位数恢复一个
|
|
|
- }
|
|
|
- else if (ts.TotalMinutes >= 0)
|
|
|
- {
|
|
|
- //通知PLC减少一个可预约车位数
|
|
|
- reserveQueue.Enqueue(msg);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- reserveQueue.Enqueue(msg);
|
|
|
- }
|
|
|
- }
|
|
|
- catch { }
|
|
|
- }
|
|
|
- }
|
|
|
- Thread.Sleep(5000);
|
|
|
- }
|
|
|
+ ReserveMsgHandling();
|
|
|
});
|
|
|
return true;
|
|
|
}
|
|
|
-
|
|
|
+ /// <summary>
|
|
|
+ /// 停止消息接收模块
|
|
|
+ /// </summary>
|
|
|
public void Stop()
|
|
|
{
|
|
|
isClosing = true;
|
|
@@ -349,31 +447,37 @@ namespace centralController.WebServer
|
|
|
//throw new NotImplementedException();
|
|
|
}
|
|
|
/// <summary>
|
|
|
- /// 预约车辆检测
|
|
|
+ /// 预约车辆入场检测
|
|
|
/// </summary>
|
|
|
/// <param name="license"></param>
|
|
|
/// <returns></returns>
|
|
|
public bool ReservedCarCheck(string license)
|
|
|
{
|
|
|
- lock (reserveLock)
|
|
|
+ //对提前入场车辆,将预约指令丢出
|
|
|
+ lock (waitToReserveLock)
|
|
|
+ {
|
|
|
+ for (int i = 0; i < waitToReserveQueue.Count; i++)
|
|
|
+ {
|
|
|
+ MessageUTF8 msg = waitToReserveQueue.Dequeue();
|
|
|
+ if (msg.context != license)
|
|
|
+ {
|
|
|
+ waitToReserveQueue.Enqueue(msg);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //已进入预约状态车辆入场,审核确认后指令丢出
|
|
|
+ lock (reservedLock)
|
|
|
{
|
|
|
- for (int i = 0; i < reserveQueue.Count; i++)
|
|
|
+ for (int i = 0; i < reservedQueue.Count; i++)
|
|
|
{
|
|
|
- MessageUTF8 msg = reserveQueue.Dequeue();
|
|
|
+ MessageUTF8 msg = reservedQueue.Dequeue();
|
|
|
if (msg.context == license)
|
|
|
{
|
|
|
- if((DateTime.Now - DateTime.Parse(msg.bookTime)).TotalMinutes >= 0)
|
|
|
- {
|
|
|
- return true;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //车辆提前入场,不算为预约车辆
|
|
|
- }
|
|
|
+ return true;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- reserveQueue.Enqueue(msg);
|
|
|
+ reservedQueue.Enqueue(msg);
|
|
|
}
|
|
|
}
|
|
|
}
|