|
@@ -2,50 +2,336 @@ 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<PLCS7.TerminalStru> terminalInfo = new List<PLCS7.TerminalStru>();
|
|
|
+ public class Terminal : ITerminalDisplay
|
|
|
+ {
|
|
|
+ public static List<TerminalStru> terminalInfo = new List<PLCS7.TerminalStru>();
|
|
|
+ public static Dictionary<int, string> idLicMap = new Dictionary<int, string>();
|
|
|
public static bool isClosing = false;
|
|
|
|
|
|
- public void FeeCal()
|
|
|
- {
|
|
|
+ public void FeeCal()
|
|
|
+ {
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- public void GetTerminalState()
|
|
|
- {
|
|
|
+ public void GetTerminalState()
|
|
|
+ {
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- public List<object> GetParkingRecords()
|
|
|
- {
|
|
|
- return null;
|
|
|
- }
|
|
|
+ public List<object> GetParkingRecords()
|
|
|
+ {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
|
|
|
- public List<object> GetOrderRecords()
|
|
|
- {
|
|
|
- return null;
|
|
|
- }
|
|
|
+ public List<object> GetOrderRecords()
|
|
|
+ {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
|
|
|
- private object SearchPaymentScheme()
|
|
|
- {
|
|
|
- return null;
|
|
|
- }
|
|
|
+ private object SearchPaymentScheme()
|
|
|
+ {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
|
|
|
- private void UpdateParkingRecords(int Object)
|
|
|
- {
|
|
|
+ private void UpdateParkingRecords(int Object)
|
|
|
+ {
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
+ private void UpdateAllParkingSpace()
|
|
|
+ {
|
|
|
+ string findParkingSpace = "select parkingSpaceID from parkingspace;";
|
|
|
+ MySqlDataReader reader = Monitor.Monitor.localDBOper.Query(findParkingSpace);
|
|
|
+ HashSet<int> recordsIDSet = new HashSet<int>();
|
|
|
+ if (reader != null)
|
|
|
+ {
|
|
|
+ while (reader.Read())
|
|
|
+ {
|
|
|
+ if (reader.HasRows)
|
|
|
+ {
|
|
|
+ recordsIDSet.Add(reader.GetInt32("parkingSpaceID"));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ List<string> updateSpaceList = new List<string>();
|
|
|
+ List<string> insertSpaceList = new List<string>();
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ /// <summary>
|
|
|
+ /// 从终端结构体中获得车牌号
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="ts"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ 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<byte> newBytes = new List<byte>();
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+ /// <summary>
|
|
|
+ /// 更新车辆状态
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="lic"></param>
|
|
|
+ /// <param name="state"></param>
|
|
|
+ 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<string> list = new List<string>();
|
|
|
+ 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<string> list = new List<string>();
|
|
|
+ list.Add(insertVehicleWithState);
|
|
|
+ if (!remote)
|
|
|
+ {
|
|
|
+ Monitor.Monitor.localDBOper.Insert(list);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ Monitor.Monitor.remoteDBOper.Insert(list);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /// <summary>
|
|
|
+ /// 停车流程,收到号牌机启动后操作过程
|
|
|
+ /// </summary>
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /// <summary>
|
|
|
+ /// 停车相关操作
|
|
|
+ /// 1.读取到号牌机启动指令,启动号牌机并根据是否注册用户进行操作
|
|
|
+ /// 非注册拿到号牌后记录并告知plc
|
|
|
+ /// 注册用户,核对号牌与用户关联信息
|
|
|
+ /// 2.停车流程结束,写数据库
|
|
|
+ /// </summary>
|
|
|
private void ParkProcess()
|
|
|
{
|
|
|
- //读取到号牌机启动指令
|
|
|
- if (Monitor.Monitor.mainBlockInfo.numMachineLaunch != (short)0)
|
|
|
+ //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<string> list = new List<string>();
|
|
|
+ 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()
|
|
@@ -55,11 +341,12 @@ namespace Terminal
|
|
|
|
|
|
public void Start()
|
|
|
{
|
|
|
- Task.Factory.StartNew(()=> {
|
|
|
-
|
|
|
+ Task.Factory.StartNew(() =>
|
|
|
+ {
|
|
|
+
|
|
|
});
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
public void Stop()
|
|
|
{
|
|
|
isClosing = true;
|