Browse Source

将预约停车指令根据时间分别存放在两个队列中(准备预约与已预约),代码整理功能细分,为PLC操作留出接口,待测试

yc_t 6 years ago
parent
commit
4cc0975798
1 changed files with 182 additions and 78 deletions
  1. 182 78
      PLCLinker/centralController/WebServer/WebServer.cs

+ 182 - 78
PLCLinker/centralController/WebServer/WebServer.cs

@@ -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);
                     }
                 }
             }