Terminal.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. using Terminal;
  2. using DatabaseDLL;
  3. using System.Collections.Generic;
  4. using System.Threading.Tasks;
  5. using PLCS7;
  6. using System;
  7. using System.Text;
  8. using MySql.Data.MySqlClient;
  9. using System.Threading;
  10. namespace Terminal
  11. {
  12. public class Terminal : ITerminalDisplay
  13. {
  14. public static List<TerminalStru> terminalInfo = new List<PLCS7.TerminalStru>();
  15. public static Dictionary<int, string> idLicMap = new Dictionary<int, string>();
  16. public static bool isClosing = false;
  17. public void FeeCal()
  18. {
  19. }
  20. public void GetTerminalState()
  21. {
  22. }
  23. public List<object> GetParkingRecords()
  24. {
  25. return null;
  26. }
  27. public List<object> GetOrderRecords()
  28. {
  29. return null;
  30. }
  31. private object SearchPaymentScheme()
  32. {
  33. return null;
  34. }
  35. private void UpdateParkingRecords(int Object)
  36. {
  37. }
  38. private void UpdateAllParkingSpace()
  39. {
  40. string findParkingSpace = "select parkingSpaceID from parkingspace;";
  41. MySqlDataReader reader = Monitor.Monitor.localDBOper.Query(findParkingSpace);
  42. HashSet<int> recordsIDSet = new HashSet<int>();
  43. if (reader != null)
  44. {
  45. while (reader.Read())
  46. {
  47. if (reader.HasRows)
  48. {
  49. recordsIDSet.Add(reader.GetInt32("parkingSpaceID"));
  50. }
  51. }
  52. }
  53. List<string> updateSpaceList = new List<string>();
  54. List<string> insertSpaceList = new List<string>();
  55. string updateParkingSpace = "";
  56. string insertParkingSpace = "";
  57. for (int i = 0; i < Monitor.Monitor.parkingSpaceInfo.Count; i++)
  58. {
  59. if (recordsIDSet.Contains(Monitor.Monitor.parkingSpaceInfo[i].parkingSpace))
  60. {
  61. updateParkingSpace = "update parkingspace set parkingSpaceX = " + Monitor.Monitor.parkingSpaceInfo[i].coordX +
  62. ",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 + ");";
  63. updateSpaceList.Add(updateParkingSpace);
  64. }
  65. else
  66. {
  67. insertParkingSpace = "insert into parkingspace (parkingSpaceID,parkingSpaceX,parkingSpaceY,parkingSpaceZ,parkingSpaceState) values (" + Monitor.Monitor.parkingSpaceInfo[i].parkingSpace + "," + Monitor.Monitor.parkingSpaceInfo[i].coordX +
  68. "," + Monitor.Monitor.parkingSpaceInfo[i].coordY + "," + Monitor.Monitor.parkingSpaceInfo[i].floorNo + "," + Monitor.Monitor.parkingSpaceInfo[i].spaceStatus + ");";
  69. insertSpaceList.Add(insertParkingSpace);
  70. }
  71. }
  72. }
  73. /// <summary>
  74. /// 从终端结构体中获得车牌号
  75. /// </summary>
  76. /// <param name="ts"></param>
  77. /// <returns></returns>
  78. private string GetLicenseFromTerm(TerminalStru ts)
  79. {
  80. string header = Encoding.ASCII.GetString(BitConverter.GetBytes(ts.licenseCodeB));
  81. string identityA = Encoding.ASCII.GetString(BitConverter.GetBytes(ts.licenseCodeC));
  82. byte[] bytes = BitConverter.GetBytes(ts.licenseCodeD);
  83. List<byte> newBytes = new List<byte>();
  84. for (int i = 0; i < bytes.Length; i++)
  85. {
  86. if (bytes[i] != 0x00) { newBytes.Add(bytes[i]); }
  87. }
  88. string identityB = Encoding.ASCII.GetString(newBytes.ToArray());
  89. return header + identityA + identityB;
  90. }
  91. /// <summary>
  92. /// 更新车辆状态
  93. /// </summary>
  94. /// <param name="lic"></param>
  95. /// <param name="state"></param>
  96. private void UpdateVehicle(string lic, int state, int parkingRecordsID, bool park, bool remote)
  97. {
  98. MySqlDataReader reader;
  99. //查询车辆是否在车辆表中
  100. string checkVehicleState = "select * from vehicle where numberPlate = '" + lic + "';";
  101. if (!remote)
  102. {
  103. reader = Monitor.Monitor.localDBOper.Query(checkVehicleState);
  104. }
  105. else
  106. {
  107. reader = Monitor.Monitor.remoteDBOper.Query(checkVehicleState);
  108. }
  109. if (reader != null)
  110. {
  111. //更新车辆状态
  112. string updateVehicleState = "";
  113. if (park)
  114. {
  115. updateVehicleState = "update vehicle set vehiclepParkState = " + state + " ,parkingRecordsID = " + parkingRecordsID + " where numberPlate = '" + lic + "';";
  116. }
  117. else
  118. {
  119. updateVehicleState = "update vehicle set vehiclepParkState = " + state + " where numberPlate = '" + lic + "';";
  120. }
  121. List<string> list = new List<string>();
  122. list.Add(updateVehicleState);
  123. if (!remote)
  124. {
  125. Monitor.Monitor.localDBOper.UpdateTransaction(list);
  126. }
  127. else
  128. {
  129. Monitor.Monitor.localDBOper.UpdateTransaction(list);
  130. }
  131. }
  132. else
  133. {
  134. //插入车辆
  135. string insertVehicleWithState = "";
  136. if (park)
  137. {
  138. insertVehicleWithState = "insert into vehicle (numberPlate,vehicleTypeID,vehiclepParkState,parkingRecordsID) values " +
  139. "('" + lic + "',NULL,'" + state + "'," + parkingRecordsID + ");";
  140. }
  141. else
  142. {
  143. Console.WriteLine("明显异常,取车发现无车辆");
  144. return;
  145. }
  146. List<string> list = new List<string>();
  147. list.Add(insertVehicleWithState);
  148. if (!remote)
  149. {
  150. Monitor.Monitor.localDBOper.Insert(list);
  151. }
  152. else
  153. {
  154. Monitor.Monitor.remoteDBOper.Insert(list);
  155. }
  156. }
  157. }
  158. /// <summary>
  159. /// 停车流程,收到号牌机启动后操作过程
  160. /// </summary>
  161. private void ParkNumSubProcess()
  162. {
  163. int numMachineLaunch = Monitor.Monitor.mainBlockInfo.numMachineLaunch;
  164. if (numMachineLaunch != 0)
  165. {
  166. for (int i = 0; i < terminalInfo.Count; i++)
  167. {
  168. //启动指令与终端id匹配
  169. if (numMachineLaunch == terminalInfo[i].terminalID)
  170. {
  171. TerminalStru term = terminalInfo[i];
  172. if (term.terminalStatus == (short)0)
  173. {
  174. string license = Monitor.Monitor.numMachineLinker.GetLicensePlate(numMachineLaunch);
  175. if (license != "")
  176. {
  177. //记录或更新当前号牌
  178. lock (idLicMap)
  179. {
  180. if (idLicMap.ContainsKey(numMachineLaunch))
  181. {
  182. idLicMap[numMachineLaunch] = license;
  183. }
  184. else
  185. {
  186. idLicMap.Add(numMachineLaunch, license);
  187. }
  188. }
  189. //注册
  190. if (term.btnStatus == (short)0)
  191. {
  192. int userID = term.licenseCodeA;
  193. string userLicense = GetLicenseFromTerm(term);
  194. TerminalStru ts = new TerminalStru
  195. {
  196. paymentStatus = -1,
  197. parkingFee = -1,
  198. userType = -1
  199. };
  200. //与云端数据比对
  201. string checkNetSql = "select * from user where userID=1;";
  202. if (Monitor.Monitor.remoteDBOper.Query(checkNetSql) != null)
  203. {
  204. string userInfoCheckSql = "select * from usercarrelation where userID = '" + userID + "'and numberPlate = '" + userLicense + "';";
  205. MySqlDataReader reader = Monitor.Monitor.remoteDBOper.Query(userInfoCheckSql);
  206. if (reader == null)
  207. {
  208. ts.licVerification = 2;//验证失败
  209. Monitor.Monitor.PLC.WriteToPLC(ts, PLCDataType.central);
  210. }
  211. else
  212. {
  213. ts.licVerification = 1;//验证成功
  214. Monitor.Monitor.PLC.WriteToPLC(ts, PLCDataType.central);
  215. }
  216. }
  217. else
  218. {
  219. ts.licVerification = 1;//网络异常,跳过验证
  220. Monitor.Monitor.PLC.WriteToPLC(ts, PLCDataType.central);
  221. }
  222. //告知PLC获取号牌
  223. MainBlockStru mb = new MainBlockStru
  224. {
  225. licenseReceived = (short)1
  226. };
  227. Monitor.Monitor.PLC.WriteToPLC(mb, PLCDataType.central);
  228. }
  229. //非注册
  230. else
  231. {
  232. MainBlockStru mb = new MainBlockStru
  233. {
  234. licenseReceived = (short)1
  235. };
  236. Monitor.Monitor.PLC.WriteToPLC(mb, PLCDataType.central);
  237. }
  238. }
  239. }
  240. }
  241. }
  242. }
  243. }
  244. /// <summary>
  245. /// 停车相关操作
  246. /// 1.读取到号牌机启动指令,启动号牌机并根据是否注册用户进行操作
  247. /// 非注册拿到号牌后记录并告知plc
  248. /// 注册用户,核对号牌与用户关联信息
  249. /// 2.停车流程结束,写数据库
  250. /// </summary>
  251. private void ParkProcess()
  252. {
  253. //1.号牌机启动
  254. Task.Factory.StartNew(() =>
  255. {
  256. while (!isClosing)
  257. {
  258. ParkNumSubProcess();
  259. Thread.Sleep(Monitor.Monitor.plcRefreshInterval);
  260. }
  261. });
  262. //2.停车流程结束
  263. int processAttrib = Monitor.Monitor.mainBlockInfo.parkingRunning;
  264. int processCompleted = Monitor.Monitor.mainBlockInfo.processCompleted;
  265. int currentTerm = Monitor.Monitor.mainBlockInfo.terminalID;
  266. int parkingSpaceID = 0;
  267. if (processAttrib == 1 && processCompleted == 1)
  268. {
  269. TerminalStru term;
  270. string license;
  271. //找到终端号,判断是否注册用户
  272. for (int i = 0; i < terminalInfo.Count; i++)
  273. {
  274. //拿到号牌
  275. if (terminalInfo[i].terminalID == currentTerm && idLicMap.TryGetValue(currentTerm, out license) && license != "")
  276. {
  277. term = terminalInfo[i];
  278. //找到停车位置
  279. for (int s = 0; s < Monitor.Monitor.parkingSpaceInfo.Count; s++)
  280. {
  281. if (Monitor.Monitor.parkingSpaceInfo[i].receiptNum == term.receiptNum)
  282. {
  283. parkingSpaceID = Monitor.Monitor.parkingSpaceInfo[i].parkingSpace;
  284. break;
  285. }
  286. }
  287. //无车位信息则跳出当前循环
  288. if (parkingSpaceID == 0) break;
  289. //插入停车记录
  290. string parkingRecordsSql = "";
  291. if (term.licenseCodeA != 0)
  292. {
  293. parkingRecordsSql = "INSERT INTO parkingrecords (userID, numberPlate,parkingSpaceID,garageID,parkingRecordsState,realParkTime,receiptNum,parkingPrice)" +
  294. "values ('" + term.licenseCodeA + "','" + license + "','" + parkingSpaceID + "','" + Monitor.Monitor.garageID + "',3,'" + DateTime.Now.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss") + "','" + term.receiptNum + "',NULL);";
  295. }
  296. else
  297. {
  298. parkingRecordsSql = "INSERT INTO parkingrecords (userID, numberPlate,parkingSpaceID,garageID,parkingRecordsState,realParkTime,receiptNum,parkingPrice)" +
  299. "values ('" + 1 + "','" + license + "','" + parkingSpaceID + "','" + Monitor.Monitor.garageID + "',3,'" + DateTime.Now.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss") + "','" + term.receiptNum + "',NULL);";
  300. }
  301. List<string> list = new List<string>();
  302. list.Add(parkingRecordsSql);
  303. Monitor.Monitor.localDBOper.Insert(list);
  304. //查询记录ID号
  305. string findRecordSql = "select parkingRecordsID from parkingrecords where receiptNum = " + term.receiptNum + ";";
  306. MySqlDataReader reader = Monitor.Monitor.localDBOper.Query(findRecordSql);
  307. int parkingRecordsID = 0;
  308. try { parkingRecordsID = reader.GetInt32("parkingRecordsID"); } catch (Exception) { break; };
  309. //更新本地车辆表
  310. UpdateVehicle(license, parkingRecordsID, 1, true, false);
  311. //注册用户加入云端操作
  312. if (term.btnStatus == 0)
  313. {
  314. //string
  315. //Monitor.Monitor.remoteDBOper()
  316. }
  317. }
  318. }
  319. }
  320. }
  321. private void FetchProcess()
  322. {
  323. }
  324. public void Start()
  325. {
  326. Task.Factory.StartNew(() =>
  327. {
  328. });
  329. }
  330. public void Stop()
  331. {
  332. isClosing = true;
  333. }
  334. }
  335. }