using centralController.model; using nettyCommunication; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace centralController.WebServer { class MyWebServer : IWebServer { private Queue reserveQueue = null; private object reserveLock = new object(); private Communication comm = null; private bool isClosing { get; set; } private bool connected { get; set; } public void BookFetchRecord() { throw new NotImplementedException(); } public void BookParkRecord() { throw new NotImplementedException(); } private bool UpdateVehicleState(bool localDB, int state, int orderRecordsID, string license) { string vehicleUpdateSql = ""; string vehicleInsertSql = ""; 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 + ");"; } List vehicleUpdateList = new List(); List vehicleInsertList = new List(); vehicleUpdateList.Add(vehicleUpdateSql); vehicleInsertList.Add(vehicleInsertSql); if (localDB) { if (!Monitor.Monitor.localDBOper.UpdateTransaction(vehicleUpdateList)) { if (!Monitor.Monitor.localDBOper.Insert(vehicleInsertList)) return false; else return true; } else return true; } else { if (!Monitor.Monitor.remoteDBOper.UpdateTransaction(vehicleUpdateList)) { if (!Monitor.Monitor.remoteDBOper.Insert(vehicleInsertList)) return false; else return true; } else return true; } } private bool OrderDBOperation(bool localDB, string userID, bool parking, string license, string orderTime, int orderLength) { //预约记录插入db string orderRecordInsertSql; if (parking) { orderRecordInsertSql = "insert into orderrecords (userID,numberPlate,garageID, bookParkTime, bookHour, bookPrice,bookState) " + "VALUES (" + userID + ", '" + license + "', '" + Monitor.Monitor.garageID + "', '" + orderTime + "', " + orderLength + ",NULL, '0');"; } else { orderRecordInsertSql = "insert into orderrecords (userID,numberPlate,garageID, bookFetchTime, bookHour, bookPrice,bookState) " + "VALUES (" + userID + ", '" + license + "', '" + Monitor.Monitor.garageID + "', '" + orderTime + "', " + orderLength + ",NULL, '2');"; } List orderList = new List(); orderList.Add(orderRecordInsertSql); if (localDB) Monitor.Monitor.localDBOper.Insert(orderList); else Monitor.Monitor.remoteDBOper.Insert(orderList); //查询预约记录id号 int currentID = 0; List 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]; } else { /*反馈web,预约失败*/ return false; } //更新车辆状态 UpdateVehicleState(localDB, parking ? 4 : 5, currentID, license); return true; } private void MsgHandling(MessageUTF8 msg) { switch (msg.cmd) { //预约停 case "a": lock (reserveLock) { reserveQueue.Enqueue(msg); } //通知PLC减少可预约车位数 //预约记录与车辆状态写入数据库 OrderDBOperation(true, msg.sender, true, msg.context, msg.bookTime, 3); OrderDBOperation(false, msg.sender, true, msg.context, msg.bookTime, 3); break; //预约取 case "b": break; //更新广告 case "c": string adAlert = ""; bool result = Monitor.Monitor.advertMgr.UpdateAdvert(out adAlert); if (!result) { Monitor.Monitor.SetNotification("广告更新失败,请尝试手动更新"); } else { Monitor.Monitor.SetNotification("广告更新成功\n" + adAlert); } break; default: Monitor.Monitor.SetNotification("接收到无法识别的指令"); break; } } /// /// 启动消息接收,启动超时指令处理 /// /// /// public bool Start(int port) { isClosing = false; MessageUTF8 message = new MessageUTF8(); message.context = "sending message test"; message.cmd = "S"; message.parkingRecordsID = 1; Task.Factory.StartNew(() => { //初始化后与web持续连接 while (!isClosing) { try { Connections.Connection(); connected = true; comm = new Communication(); break; } catch (Exception) { connected = false; Console.WriteLine("服务没有开启,请检查服务器"); } Thread.Sleep(1500); } //持续监听 while (!isClosing) { if (Connections.isAlive()) { if (!connected) { comm = new Communication(); } connected = true; if (comm != null) { //comm.SendMessage(message);//消息 MessageUTF8 msg = ((MessageUTF8)comm.ReceiveMessage()); MsgHandling(msg); Console.WriteLine(msg.context); } } else { connected = false; Console.WriteLine(" 连接关闭,需要重新连接注册"); try { Connections.Connection(); } catch (Exception) { Console.WriteLine("服务没有开启,请检查服务器"); } } Thread.Sleep(1000); } }); //处理超时预约指令 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); //if ((DateTime.Now - startTime).TotalMinutes > msg.bookLength * 60) if ((DateTime.Now - startTime).TotalMinutes > 3 * 60) { //通知PLC将可预约车位数恢复一个 } else { reserveQueue.Enqueue(msg); } } catch { } } } Thread.Sleep(5000); } }); return true; } public void Stop() { isClosing = true; Connections.close(); //throw new NotImplementedException(); } /// /// 预约车辆检测 /// /// /// public bool ReservedCarCheck(string license) { lock (reserveLock) { for (int i = 0; i < reserveQueue.Count; i++) { MessageUTF8 msg = reserveQueue.Dequeue(); if (msg.context == license) { return true; } else { reserveQueue.Enqueue(msg); } } } return false; } } }