using Terminal; using DatabaseDLL; using System.Collections.Generic; using System.Threading.Tasks; using PLCS7; using System; using System.Text; using MySql.Data.MySqlClient; using System.Threading; namespace Terminal { public class Terminal : ITerminalDisplay { public static List terminalInfo = new List(); public static Dictionary idLicMap = new Dictionary(); public static bool isClosing = false; public void FeeCal() { } public void GetTerminalState() { } public List GetParkingRecords() { return null; } public List GetOrderRecords() { return null; } private object SearchPaymentScheme() { return null; } private void UpdateParkingRecords(int Object) { } private void UpdateAllParkingSpace() { string findParkingSpace = "select parkingSpaceID from parkingspace;"; MySqlDataReader reader = Monitor.Monitor.localDBOper.Query(findParkingSpace); HashSet recordsIDSet = new HashSet(); if (reader != null) { while (reader.Read()) { if (reader.HasRows) { recordsIDSet.Add(reader.GetInt32("parkingSpaceID")); } } } List updateSpaceList = new List(); List insertSpaceList = new List(); string updateParkingSpace = ""; string insertParkingSpace = ""; for (int i = 0; i < Monitor.Monitor.parkingSpaceInfo.Count; i++) { if (recordsIDSet.Contains(Monitor.Monitor.parkingSpaceInfo[i].parkingSpace)) { updateParkingSpace = "update parkingspace set parkingSpaceX = " + Monitor.Monitor.parkingSpaceInfo[i].coordX + ",parkingSpaceY = " + Monitor.Monitor.parkingSpaceInfo[i].coordY + ",parkingSpaceZ = " + Monitor.Monitor.parkingSpaceInfo[i].floorNo + ",parkingSpaceState = " + Monitor.Monitor.parkingSpaceInfo[i].spaceStatus + " where (parkingSpaceID = " + Monitor.Monitor.parkingSpaceInfo[i].parkingSpace + ");"; updateSpaceList.Add(updateParkingSpace); } else { insertParkingSpace = "insert into parkingspace (parkingSpaceID,parkingSpaceX,parkingSpaceY,parkingSpaceZ,parkingSpaceState) values (" + Monitor.Monitor.parkingSpaceInfo[i].parkingSpace + "," + Monitor.Monitor.parkingSpaceInfo[i].coordX + "," + Monitor.Monitor.parkingSpaceInfo[i].coordY + "," + Monitor.Monitor.parkingSpaceInfo[i].floorNo + "," + Monitor.Monitor.parkingSpaceInfo[i].spaceStatus + ");"; insertSpaceList.Add(insertParkingSpace); } } } /// /// 从终端结构体中获得车牌号 /// /// /// private string GetLicenseFromTerm(TerminalStru ts) { string header = Encoding.ASCII.GetString(BitConverter.GetBytes(ts.licenseCodeB)); string identityA = Encoding.ASCII.GetString(BitConverter.GetBytes(ts.licenseCodeC)); byte[] bytes = BitConverter.GetBytes(ts.licenseCodeD); List newBytes = new List(); for (int i = 0; i < bytes.Length; i++) { if (bytes[i] != 0x00) { newBytes.Add(bytes[i]); } } string identityB = Encoding.ASCII.GetString(newBytes.ToArray()); return header + identityA + identityB; } /// /// 更新车辆状态 /// /// /// private void UpdateVehicle(string lic, int state, int parkingRecordsID, bool park, bool remote) { MySqlDataReader reader; //查询车辆是否在车辆表中 string checkVehicleState = "select * from vehicle where numberPlate = '" + lic + "';"; if (!remote) { reader = Monitor.Monitor.localDBOper.Query(checkVehicleState); } else { reader = Monitor.Monitor.remoteDBOper.Query(checkVehicleState); } if (reader != null) { //更新车辆状态 string updateVehicleState = ""; if (park) { updateVehicleState = "update vehicle set vehiclepParkState = " + state + " ,parkingRecordsID = " + parkingRecordsID + " where numberPlate = '" + lic + "';"; } else { updateVehicleState = "update vehicle set vehiclepParkState = " + state + " where numberPlate = '" + lic + "';"; } List list = new List(); list.Add(updateVehicleState); if (!remote) { Monitor.Monitor.localDBOper.UpdateTransaction(list); } else { Monitor.Monitor.localDBOper.UpdateTransaction(list); } } else { //插入车辆 string insertVehicleWithState = ""; if (park) { insertVehicleWithState = "insert into vehicle (numberPlate,vehicleTypeID,vehiclepParkState,parkingRecordsID) values " + "('" + lic + "',NULL,'" + state + "'," + parkingRecordsID + ");"; } else { Console.WriteLine("明显异常,取车发现无车辆"); return; } List list = new List(); list.Add(insertVehicleWithState); if (!remote) { Monitor.Monitor.localDBOper.Insert(list); } else { Monitor.Monitor.remoteDBOper.Insert(list); } } } /// /// 停车流程,收到号牌机启动后操作过程 /// private void ParkNumSubProcess() { int numMachineLaunch = Monitor.Monitor.mainBlockInfo.numMachineLaunch; if (numMachineLaunch != 0) { for (int i = 0; i < terminalInfo.Count; i++) { //启动指令与终端id匹配 if (numMachineLaunch == terminalInfo[i].terminalID) { TerminalStru term = terminalInfo[i]; if (term.terminalStatus == (short)0) { string license = Monitor.Monitor.numMachineLinker.GetLicensePlate(numMachineLaunch); if (license != "") { //记录或更新当前号牌 lock (idLicMap) { if (idLicMap.ContainsKey(numMachineLaunch)) { idLicMap[numMachineLaunch] = license; } else { idLicMap.Add(numMachineLaunch, license); } } //注册 if (term.btnStatus == (short)0) { int userID = term.licenseCodeA; string userLicense = GetLicenseFromTerm(term); TerminalStru ts = new TerminalStru { paymentStatus = -1, parkingFee = -1, userType = -1 }; //与云端数据比对 string checkNetSql = "select * from user where userID=1;"; if (Monitor.Monitor.remoteDBOper.Query(checkNetSql) != null) { string userInfoCheckSql = "select * from usercarrelation where userID = '" + userID + "'and numberPlate = '" + userLicense + "';"; MySqlDataReader reader = Monitor.Monitor.remoteDBOper.Query(userInfoCheckSql); if (reader == null) { ts.licVerification = 2;//验证失败 Monitor.Monitor.PLC.WriteToPLC(ts, PLCDataType.central); } else { ts.licVerification = 1;//验证成功 Monitor.Monitor.PLC.WriteToPLC(ts, PLCDataType.central); } } else { ts.licVerification = 1;//网络异常,跳过验证 Monitor.Monitor.PLC.WriteToPLC(ts, PLCDataType.central); } //告知PLC获取号牌 MainBlockStru mb = new MainBlockStru { licenseReceived = (short)1 }; Monitor.Monitor.PLC.WriteToPLC(mb, PLCDataType.central); } //非注册 else { MainBlockStru mb = new MainBlockStru { licenseReceived = (short)1 }; Monitor.Monitor.PLC.WriteToPLC(mb, PLCDataType.central); } } } } } } } /// /// 停车相关操作 /// 1.读取到号牌机启动指令,启动号牌机并根据是否注册用户进行操作 /// 非注册拿到号牌后记录并告知plc /// 注册用户,核对号牌与用户关联信息 /// 2.停车流程结束,写数据库 /// private void ParkProcess() { //1.号牌机启动 Task.Factory.StartNew(() => { while (!isClosing) { ParkNumSubProcess(); Thread.Sleep(Monitor.Monitor.plcRefreshInterval); } }); //2.停车流程结束 int processAttrib = Monitor.Monitor.mainBlockInfo.parkingRunning; int processCompleted = Monitor.Monitor.mainBlockInfo.processCompleted; int currentTerm = Monitor.Monitor.mainBlockInfo.terminalID; int parkingSpaceID = 0; if (processAttrib == 1 && processCompleted == 1) { TerminalStru term; string license; //找到终端号,判断是否注册用户 for (int i = 0; i < terminalInfo.Count; i++) { //拿到号牌 if (terminalInfo[i].terminalID == currentTerm && idLicMap.TryGetValue(currentTerm, out license) && license != "") { term = terminalInfo[i]; //找到停车位置 for (int s = 0; s < Monitor.Monitor.parkingSpaceInfo.Count; s++) { if (Monitor.Monitor.parkingSpaceInfo[i].receiptNum == term.receiptNum) { parkingSpaceID = Monitor.Monitor.parkingSpaceInfo[i].parkingSpace; break; } } //无车位信息则跳出当前循环 if (parkingSpaceID == 0) break; //插入停车记录 string parkingRecordsSql = ""; if (term.licenseCodeA != 0) { parkingRecordsSql = "INSERT INTO parkingrecords (userID, numberPlate,parkingSpaceID,garageID,parkingRecordsState,realParkTime,receiptNum,parkingPrice)" + "values ('" + term.licenseCodeA + "','" + license + "','" + parkingSpaceID + "','" + Monitor.Monitor.garageID + "',3,'" + DateTime.Now.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss") + "','" + term.receiptNum + "',NULL);"; } else { parkingRecordsSql = "INSERT INTO parkingrecords (userID, numberPlate,parkingSpaceID,garageID,parkingRecordsState,realParkTime,receiptNum,parkingPrice)" + "values ('" + 1 + "','" + license + "','" + parkingSpaceID + "','" + Monitor.Monitor.garageID + "',3,'" + DateTime.Now.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss") + "','" + term.receiptNum + "',NULL);"; } List list = new List(); list.Add(parkingRecordsSql); Monitor.Monitor.localDBOper.Insert(list); //查询记录ID号 string findRecordSql = "select parkingRecordsID from parkingrecords where receiptNum = " + term.receiptNum + ";"; MySqlDataReader reader = Monitor.Monitor.localDBOper.Query(findRecordSql); int parkingRecordsID = 0; try { parkingRecordsID = reader.GetInt32("parkingRecordsID"); } catch (Exception) { break; }; //更新本地车辆表 UpdateVehicle(license, parkingRecordsID, 1, true, false); //注册用户加入云端操作 if (term.btnStatus == 0) { //string //Monitor.Monitor.remoteDBOper() } } } } } private void FetchProcess() { } public void Start() { Task.Factory.StartNew(() => { }); } public void Stop() { isClosing = true; } } }