Terminal.cs 16 KB

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