|
@@ -20,6 +20,10 @@ namespace parkMonitor.server.CoreThread
|
|
|
/// </summary>
|
|
|
public class QueuingThread : IEquipments
|
|
|
{
|
|
|
+ /// <summary>
|
|
|
+ /// 预约停车队列
|
|
|
+ /// </summary>
|
|
|
+ Queue<Command> BookParkingQueue = new Queue<Command>();
|
|
|
/// <summary>
|
|
|
/// 号牌队列,放入来自于号牌机的号牌。与当前指令队列中指令匹配不上的号牌将被放入该队列
|
|
|
/// </summary>
|
|
@@ -40,7 +44,7 @@ namespace parkMonitor.server.CoreThread
|
|
|
/// 可执行阻塞队列,放入来自于取指或合法停指的经过调度的停取车指令。
|
|
|
/// </summary>
|
|
|
BlockingQueue ExecutableCmdQueue = new BlockingQueue();
|
|
|
- int fetchStoreRatio, licenseTime, userTime;
|
|
|
+ int fetchStoreRatio, licenseTime, userTime, bookTime;
|
|
|
bool isClosing = false;
|
|
|
IEquipments webHandle = null;
|
|
|
IEquipments numMachineHandle = null;
|
|
@@ -65,6 +69,7 @@ namespace parkMonitor.server.CoreThread
|
|
|
fetchStoreRatio = Int32.Parse(ConfigurationManager.AppSettings.Get("fetch_store_ratio"));
|
|
|
licenseTime = Int32.Parse(ConfigurationManager.AppSettings.Get("licenseTime"));
|
|
|
userTime = Int32.Parse(ConfigurationManager.AppSettings.Get("userTime"));
|
|
|
+ bookTime = Int32.Parse(ConfigurationManager.AppSettings.Get("bookTime"));
|
|
|
}
|
|
|
catch (Exception) { fetchStoreRatio = 3; UILogServer.ins.error("未找到停取车比例与计时参数"); Log.WriteLog(LogType.NOT_DATABASE, LogFile.ERROR, "未找到停取车比例与计时参数"); }
|
|
|
}
|
|
@@ -84,7 +89,7 @@ namespace parkMonitor.server.CoreThread
|
|
|
{
|
|
|
webMsg = (MessageUTF8)(((MessageUTF8)webHandle.GetMessage()).Clone());
|
|
|
}
|
|
|
- catch (Exception) { UILogServer.ins.error("用户指令异常"); Log.WriteLog(LogType.NOT_DATABASE, "用户指令异常"); }
|
|
|
+ catch (Exception) { UILogServer.ins.error("用户指令异常"); Log.WriteLog(LogType.NOT_DATABASE, LogFile.ERROR, "用户指令异常"); }
|
|
|
}
|
|
|
//get useful data from webMsg and assign it to output data structure
|
|
|
if (webMsg != null)
|
|
@@ -95,7 +100,19 @@ namespace parkMonitor.server.CoreThread
|
|
|
cmd.userID = webMsg.sender;
|
|
|
cmd.garageID = webMsg.garageID;
|
|
|
cmd.parkingRecordsID = webMsg.parkingRecordsID;
|
|
|
- cmd.TimeRecord = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
|
|
|
+ if (cmd.commandType == 'p' && webMsg.bookTime != null)
|
|
|
+ {
|
|
|
+ DateTime dt = new DateTime();
|
|
|
+ if (webMsg.bookTime == "" || DateTime.TryParse(webMsg.bookTime, out dt))
|
|
|
+ {
|
|
|
+ cmd.TimeRecord = webMsg.bookTime;
|
|
|
+ }
|
|
|
+ else { Log.WriteLog(LogType.NOT_DATABASE, LogFile.ERROR, "web发送预约时间异常,指令丢弃"); return; }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ cmd.TimeRecord = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
|
|
|
+ }
|
|
|
webMsg = null;
|
|
|
}
|
|
|
//input user command
|
|
@@ -117,6 +134,28 @@ namespace parkMonitor.server.CoreThread
|
|
|
UILogServer.ins.info("收到web停车指令:" + cmd.LicenseNum);
|
|
|
Log.WriteLog(LogType.NOT_DATABASE, LogFile.INFO, "收到web停车指令:" + cmd.LicenseNum);
|
|
|
}
|
|
|
+ else if (cmd.commandType.Equals('p'))
|
|
|
+ {
|
|
|
+ if (cmd.TimeRecord == "")
|
|
|
+ {
|
|
|
+ //取消预约
|
|
|
+ UILogServer.ins.info("收到web预约停车取消指令:" + cmd.LicenseNum);
|
|
|
+ Log.WriteLog(LogType.NOT_DATABASE, LogFile.INFO, "收到web预约停车取消指令:" + cmd.LicenseNum);
|
|
|
+ ParkingSpaceManager.ins.CancleBooking(cmd.LicenseNum);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //正常预约
|
|
|
+ UILogServer.ins.info("收到web预约停车指令:" + cmd.LicenseNum);
|
|
|
+ Log.WriteLog(LogType.NOT_DATABASE, LogFile.INFO, "收到web预约停车指令:" + cmd.LicenseNum);
|
|
|
+ int count = 0;
|
|
|
+ if (!BookParkingQueue.Contains(cmd))
|
|
|
+ {
|
|
|
+ ParkingSpaceManager.ins.MallocParkingSpace(new CEntrance(EntityForCore.ins.parkingEntX, EntityForCore.ins.parkingEntY, EntityForCore.ins.parkingEntZ), cmd, true, out count);
|
|
|
+ BookParkingQueue.Enqueue(cmd);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
else
|
|
|
{
|
|
|
Log.WriteLog(LogType.NOT_DATABASE, LogFile.ERROR, "从web收到无法识别的用户指令");
|
|
@@ -180,6 +219,10 @@ namespace parkMonitor.server.CoreThread
|
|
|
{
|
|
|
NumTimeOut();
|
|
|
}
|
|
|
+ lock (BookParkingQueue)
|
|
|
+ {
|
|
|
+ BookParkingTimeOut();
|
|
|
+ }
|
|
|
Thread.Sleep(500);
|
|
|
}
|
|
|
}
|
|
@@ -194,6 +237,27 @@ namespace parkMonitor.server.CoreThread
|
|
|
return (node != null && node.ip != null && node.ip != "" && node.ip != "used") ? true : false;
|
|
|
}
|
|
|
|
|
|
+ private void BookParkingTimeOut()
|
|
|
+ {
|
|
|
+ for (int i = 0; i < BookParkingQueue.Count; i++)
|
|
|
+ {
|
|
|
+ Command cmd = BookParkingQueue.Dequeue();
|
|
|
+ if (cmd != null)
|
|
|
+ {
|
|
|
+ TimeSpan ts = DateTime.Now - DateTime.Parse(cmd.TimeRecord);
|
|
|
+ if (ts.Minutes >= bookTime)
|
|
|
+ {
|
|
|
+ //超时则释放车位,丢出指令
|
|
|
+ ParkingSpaceManager.ins.CancleBooking(cmd.LicenseNum);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ BookParkingQueue.Enqueue(cmd);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 停车指令超时处理
|
|
|
/// </summary>
|
|
@@ -349,10 +413,11 @@ namespace parkMonitor.server.CoreThread
|
|
|
while (FetchCmdQueue.Count != 0 && fetch-- > 0)
|
|
|
{
|
|
|
cmd = FetchCmdQueue.Dequeue();
|
|
|
- if ((cmd.manual && Operation.malfunctionLocal) ||(!cmd.manual && Operation.malfunctionRemote))
|
|
|
+ if ((cmd.manual && Operation.malfunctionLocal) || (!cmd.manual && Operation.malfunctionRemote))
|
|
|
{
|
|
|
FetchCmdQueue.Enqueue(cmd);
|
|
|
- }else
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
UILogServer.ins.info("任务:取出号牌为 " + cmd.LicenseNum + " 的车辆,开始排队");
|
|
|
Log.WriteLog(LogType.NOT_DATABASE, "取车命令:" + cmd.LicenseNum + "已进入可执行队列");
|
|
@@ -463,7 +528,7 @@ namespace parkMonitor.server.CoreThread
|
|
|
else
|
|
|
{
|
|
|
Log.WriteLog(LogType.NOT_DATABASE, LogFile.INFO, "本地数据库异常,暂停接收手动指令" + command.LicenseNum);
|
|
|
- UILogServer.ins.error("本地数据库异常,暂停接收关于" + command.LicenseNum+"的手动指令");
|
|
|
+ UILogServer.ins.error("本地数据库异常,暂停接收关于" + command.LicenseNum + "的手动指令");
|
|
|
}
|
|
|
}
|
|
|
}
|