yc_t 7 anni fa
parent
commit
a1a4891496

+ 15 - 5
parkMonitor/DataBase/IDBOperation.cs

@@ -116,7 +116,7 @@ namespace parkMonitor.DataBase
             while (conn != null && conn.State != ConnectionState.Open)
             {
                 mt.EndTiming();
-                if (mt.IsLonger(45, 1, false, out count) && count >= 5)
+                if (mt.IsLonger(30, 1, false, out count) && count >= 5)
                 {
                     if (conn.ConnectionString == DBConnection.remoteConf)
                     {
@@ -186,11 +186,20 @@ namespace parkMonitor.DataBase
             while (true)
             {
                 mt.EndTiming();
-                if (mt.IsLonger(45, 1, false, out counter) && counter >= 5)
+                if (mt.IsLonger(30, 1, false, out counter) && counter >= 5)
                 {
-                    UILogServer.ins.error("数据库操作异常,暂停处理自动命令。回滚后点击“启动远端DB”恢复");
-                    Log.WriteLog(LogType.NOT_DATABASE, LogFile.ERROR, "操作远端DB异常");
-                    Operation.malfunctionRemote = true;
+                    if (con.ConnectionString == DBConnection.remoteStr)
+                    {
+                        UILogServer.ins.error("数据库操作异常,暂停处理自动命令。回滚后点击“启动远端DB”恢复");
+                        Log.WriteLog(LogType.NOT_DATABASE, LogFile.ERROR, "操作远端DB异常");
+                        Operation.malfunctionRemote = true;
+                    }
+                    else
+                    {
+                        UILogServer.ins.error("数据库操作异常,暂停处理自动命令。回滚后点击“启动本地DB”恢复");
+                        Log.WriteLog(LogType.NOT_DATABASE, LogFile.ERROR, "操作远端DB异常");
+                        Operation.malfunctionLocal = true;
+                    }
                     break;
                 }
                 try
@@ -249,6 +258,7 @@ namespace parkMonitor.DataBase
                 con.Dispose();
             }
         }
+
         /// <summary>
         /// 关闭连接
         /// </summary>

+ 4 - 4
parkMonitor/controlPanel/ControlPanel.Designer.cs

@@ -37,7 +37,7 @@
             // btn_buffer_confirm
             // 
             this.btn_buffer_confirm.Font = new System.Drawing.Font("宋体", 10F);
-            this.btn_buffer_confirm.Location = new System.Drawing.Point(74, 339);
+            this.btn_buffer_confirm.Location = new System.Drawing.Point(74, 187);
             this.btn_buffer_confirm.Name = "btn_buffer_confirm";
             this.btn_buffer_confirm.Size = new System.Drawing.Size(57, 31);
             this.btn_buffer_confirm.TabIndex = 1;
@@ -48,7 +48,7 @@
             // btn_refresh
             // 
             this.btn_refresh.Font = new System.Drawing.Font("宋体", 10F);
-            this.btn_refresh.Location = new System.Drawing.Point(11, 340);
+            this.btn_refresh.Location = new System.Drawing.Point(17, 187);
             this.btn_refresh.Name = "btn_refresh";
             this.btn_refresh.Size = new System.Drawing.Size(57, 30);
             this.btn_refresh.TabIndex = 2;
@@ -69,14 +69,14 @@
             // 
             this.flp_buffer.Location = new System.Drawing.Point(17, 34);
             this.flp_buffer.Name = "flp_buffer";
-            this.flp_buffer.Size = new System.Drawing.Size(114, 280);
+            this.flp_buffer.Size = new System.Drawing.Size(114, 132);
             this.flp_buffer.TabIndex = 5;
             // 
             // ControlPanel
             // 
             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-            this.ClientSize = new System.Drawing.Size(182, 386);
+            this.ClientSize = new System.Drawing.Size(182, 230);
             this.Controls.Add(this.flp_buffer);
             this.Controls.Add(this.lb_confirmed);
             this.Controls.Add(this.btn_refresh);

+ 12 - 5
parkMonitor/controlPanel/ControlPanel.cs

@@ -76,15 +76,22 @@ namespace parkMonitor.controlPanel
 
         private void btn_buffer_confirm_Click(object sender, EventArgs e)
         {
-            if (IndexCbMap == null) { IndexCbMap = new Dictionary<int, CheckBox>(); }
-            if (ParkingBufferManager.ins != null && IndexCbMap.Count == ParkingBufferManager.ins.bufferCount)
+            if (!ParkingBufferManager.ins.checkedManually)
             {
-                for (int i = 0; i < ParkingBufferManager.ins.bufferCount; i++)
+                if (IndexCbMap == null) { IndexCbMap = new Dictionary<int, CheckBox>(); }
+                if (ParkingBufferManager.ins != null && IndexCbMap.Count == ParkingBufferManager.ins.bufferCount)
                 {
-                    ParkingBufferManager.ins.bufferList[i].idle = IndexCbMap[i].Checked;
+                    for (int i = 0; i < ParkingBufferManager.ins.bufferCount; i++)
+                    {
+                        ParkingBufferManager.ins.bufferList[i].idle = IndexCbMap[i].Checked;
+                    }
                 }
+                ParkingBufferManager.ins.checkedManually = true;
+            }
+            else
+            {
+                MessageBox.Show("请不要重复点击");
             }
-            ParkingBufferManager.ins.checkedManually = true;
             UpdateConfirmState();
         }
 

+ 109 - 38
parkMonitor/server/CoreThread/AbstractCmd.cs

@@ -162,7 +162,7 @@ namespace parkMonitor.server.CoreThread
                     {
                         Robot.robot1.occupied = true;
                         //UILogServer.ins.log("获得机械手资源");
-                        Log.WriteLog(LogType.NOT_DATABASE,LogFile.LOG, "获得机械手资源");
+                        Log.WriteLog(LogType.NOT_DATABASE, LogFile.LOG, "获得机械手资源");
                         break;
                     }
                     mt.EndTiming();
@@ -177,7 +177,7 @@ namespace parkMonitor.server.CoreThread
                         {
                             mt.rolledBack = true;
                             UILogServer.ins.error("启动机械手资源超时,已启动回滚");
-                            Log.WriteLog(LogType.NOT_DATABASE,LogFile.ERROR, "启动机械手资源超时,已启动回滚");
+                            Log.WriteLog(LogType.NOT_DATABASE, LogFile.ERROR, "启动机械手资源超时,已启动回滚");
                             return false;
                         }
                         Thread.Sleep(100);
@@ -212,31 +212,86 @@ namespace parkMonitor.server.CoreThread
             {
                 return;
             }
+
             //复位车辆状态;若已更新过车位则还需复位总车位数,车位状态
             if (!queueCmd.manual)
             {
-                //connectionStr = "SqlConnectionStr";
-                //int freeSpaceCount = oper.getGarageFreeSpace(connectionStr, queueCmd.garageID);
-                //if (isParking)
-                //{
-                //    oper.UpdateVehicleParkState(connectionStr, queueCmd.LicenseNum, 0);
-                //    if (parkingSpaceUpdated)
-                //    {
-                //        freeSpaceCount = freeSpaceCount + 1;
-                //        oper.UpdateGarageFreeSpace(connectionStr, freeSpaceCount, queueCmd.garageID);
-                //        oper.UpdateParkingSpaceState(connectionStr, parkingSpaceID, 0);
-                //    }
-                //}
-                //else
-                //{
-                //    oper.UpdateVehicleParkState(connectionStr, queueCmd.LicenseNum, 1);
-                //    if (parkingSpaceUpdated)
-                //    {
-                //        freeSpaceCount = freeSpaceCount - 1;
-                //        oper.UpdateGarageFreeSpace(connectionStr, freeSpaceCount, queueCmd.garageID);
-                //        oper.UpdateParkingSpaceState(connectionStr, parkingSpaceID, 1);
-                //    }
-                //}
+                if (isParking)
+                {
+                    //释放已分配车位
+                    if (!ParkingSpaceManager.ins.SetParkingSpace(parkingSpaceID, 0))
+                    {
+                        EntityForCore.ins.globalStatus = false;
+                        Log.WriteLog(LogType.NOT_DATABASE, LogFile.ERROR, "车位分配出现异常,需要重启");
+                        return;
+                    }
+                    try
+                    {
+                        using (MySqlConnection conn = new MySqlConnection(DBConnection.remoteConf))
+                        {
+                            Operation.TryOpen(conn);
+                            bool DBStoreStatus = false;                       //判断数据库事务操作是否正常
+                            int temp;
+                            string updateParkingSpaceSql = "update parkingspace set parkingSpaceState = 0 where parkingSpaceID = '" + parkingSpaceID + "'";
+                            string updateFreeSpaceSql = "update garage set garageFreeSpace = '" + ParkingSpaceManager.ins.GetFreeSpaceCount() + "' where garageID = '" + ParkingSpaceManager.garageID + "'";
+                            string updateVehicleStateSql = "update vehicle set vehiclepParkState = '" + 0 + "'where numberPlate = '" + queueCmd.LicenseNum + "'";
+                            List<string> strs = new List<string>();
+                            strs.Add(updateParkingSpaceSql);
+                            strs.Add(updateFreeSpaceSql);
+                            strs.Add(updateVehicleStateSql);
+                            if (!Operation.MyTransaction(conn, strs, out temp))
+                            {
+                                //数据库操作失败写日志
+                                Log.WriteLog(LogType.DATABASE, updateParkingSpaceSql);
+                                Log.WriteLog(LogType.DATABASE, updateFreeSpaceSql);
+                                Log.WriteLog(LogType.DATABASE, updateVehicleStateSql);
+                                //Log.WriteLog(LogType.DATABASE, strs.ToArray().ToString());
+                            }
+                        }
+                    }
+                    catch
+                    {
+                        throw;          //数据库异常待处理
+                    }
+                }
+                else
+                {
+                    //复原已释放的车位
+                    if (!ParkingSpaceManager.ins.SetParkingSpace(parkingSpaceID, 1))
+                    {
+                        EntityForCore.ins.globalStatus = false;
+                        Log.WriteLog(LogType.NOT_DATABASE, LogFile.ERROR, "车位分配出现异常,需要重启");
+                        return;
+                    }
+                    try
+                    {
+                        using (MySqlConnection conn = new MySqlConnection(DBConnection.remoteConf))
+                        {
+                            Operation.TryOpen(conn);
+                            bool DBStoreStatus = false;                       //判断数据库事务操作是否正常
+                            int temp;
+                            string updateParkingSpaceSql = "update parkingspace set parkingSpaceState = 1 where parkingSpaceID = '" + parkingSpaceID + "'";
+                            string updateFreeSpaceSql = "update garage set garageFreeSpace = '" + ParkingSpaceManager.ins.GetFreeSpaceCount() + "' where garageID = '" + ParkingSpaceManager.garageID + "'";
+                            string updateVehicleStateSql = "update vehicle set vehiclepParkState = '" + 1 + "'where numberPlate = '" + queueCmd.LicenseNum + "'";
+                            List<string> strs = new List<string>();
+                            strs.Add(updateParkingSpaceSql);
+                            strs.Add(updateFreeSpaceSql);
+                            strs.Add(updateVehicleStateSql);
+                            if (!Operation.MyTransaction(conn, strs, out temp))
+                            {
+                                //数据库操作失败写日志
+                                Log.WriteLog(LogType.DATABASE, updateParkingSpaceSql);
+                                Log.WriteLog(LogType.DATABASE, updateFreeSpaceSql);
+                                Log.WriteLog(LogType.DATABASE, updateVehicleStateSql);
+                                //Log.WriteLog(LogType.DATABASE, strs.ToArray().ToString());
+                            }
+                        }
+                    }
+                    catch
+                    {
+                        throw;          //数据库异常待处理
+                    }
+                }
             }
             else
             {
@@ -354,7 +409,7 @@ namespace parkMonitor.server.CoreThread
                 }
                 if (ppp != null)
                 {
-                    Log.WriteLog(LogType.NOT_DATABASE,LogFile.LOG, "停车流程:" + queueCmd.LicenseNum + "已分配车位");
+                    Log.WriteLog(LogType.NOT_DATABASE, LogFile.LOG, "停车流程:" + queueCmd.LicenseNum + "已分配车位");
                     break;
                 }
                 Thread.Sleep(200);
@@ -370,7 +425,7 @@ namespace parkMonitor.server.CoreThread
                     {
                         mt.rolledBack = true;
                         UILogServer.ins.error(queueCmd.LicenseNum + "超时未获得车位,指令退回");
-                        Log.WriteLog(LogType.NOT_DATABASE,LogFile.ERROR, queueCmd.LicenseNum + "超时未获得车位,指令退回");
+                        Log.WriteLog(LogType.NOT_DATABASE, LogFile.ERROR, queueCmd.LicenseNum + "超时未获得车位,指令退回");
                         return null;
                     }
                     Thread.Sleep(100);
@@ -436,7 +491,7 @@ namespace parkMonitor.server.CoreThread
                                     if (disconnectionCount == 1)
                                     {
                                         UILogServer.ins.error("激光" + lm.id + "连接异常");
-                                        Log.WriteLog(LogType.NOT_DATABASE,LogFile.ERROR, "激光" + lm.id + "连接异常");
+                                        Log.WriteLog(LogType.NOT_DATABASE, LogFile.ERROR, "激光" + lm.id + "连接异常");
                                     }
                                     Thread.Sleep(10000);
                                 }
@@ -602,6 +657,7 @@ namespace parkMonitor.server.CoreThread
 
             //车位分配数据库操作加锁,直到启动机械手
             Parking_Space ppp = new Parking_Space();
+            ParkingBuffer pb = null;
             Data dataReal = new Data();
             int garageID;                                      //车库ID(Web发送)
             string realParkTime;                            //停车时间(可执行队列)
@@ -617,6 +673,26 @@ namespace parkMonitor.server.CoreThread
             //车位分配锁
             lock (Parking_Space.spaceLock)
             {
+                //获取缓冲位资源
+                bool displayed = false;
+                while (pb == null && !MyTimer.restart)
+                {
+                    if (!displayed)
+                    {
+                        UILogServer.ins.error("缓冲位已满");
+                        Log.WriteLog(LogType.NOT_DATABASE, LogFile.ERROR, "缓冲位分配失败");
+                    }
+                    pb = ParkingBufferManager.ins.MallocParkingBuffer(queueCmd.id);
+                    Thread.Sleep(5000);
+                }
+                if (pb == null)
+                {
+                    UILogServer.ins.error("缓冲位分配失败,流程已回滚");
+                    Log.WriteLog(LogType.NOT_DATABASE, LogFile.ERROR, "缓冲位分配失败,流程已回滚");
+                    Rollback(queueCmd, 0, false, true, lmToBeReleased);
+                    return;
+                }
+
                 //获取车位资源
                 ppp = WaitForParkingSpaceResource(queueCmd, out freeSpaceCount);
 
@@ -682,7 +758,7 @@ namespace parkMonitor.server.CoreThread
                             bool DBStoreStatus = false;                       //判断数据库事务操作是否正常
                             int temp;
                             string updateParkingSpaceSql = "update parkingspace set parkingSpaceState = 1 where parkingSpaceID = '" + ppp.parkingSpaceID + "'";
-                            string updateFreeSpaceSql = "update garage set garageFreeSpace = '" + freeSpaceCount+ "' where garageID = '" + garageID + "'";
+                            string updateFreeSpaceSql = "update garage set garageFreeSpace = '" + freeSpaceCount + "' where garageID = '" + garageID + "'";
                             List<string> strs = new List<string>();
                             strs.Add(updateParkingSpaceSql);
                             strs.Add(updateFreeSpaceSql);
@@ -748,12 +824,7 @@ namespace parkMonitor.server.CoreThread
             status = 2;
             cm.status = status;
             cm.RobotID = robotID;//启动对应机械手
-            ParkingBuffer pb = ParkingBufferManager.ins.MallocParkingBuffer(queueCmd.id);
-            if (pb == null)
-            {
-                Rollback(queueCmd, ppp.parkingSpaceID, true, true, lmToBeReleased);
-                return;
-            }
+
             //激光数据
             cm.centerX = Convert.ToString(dataReal.centerX);
             cm.centerY = Convert.ToString(dataReal.centerY);
@@ -796,7 +867,7 @@ namespace parkMonitor.server.CoreThread
 
             //停车流程结束,将相应车牌复位,从号牌队列中出队
             NumReset(queueCmd);
-            Log.WriteLog(LogType.NOT_DATABASE,LogFile.LOG, "停车流程:" + queueCmd.LicenseNum + "停车完成,状态复位");
+            Log.WriteLog(LogType.NOT_DATABASE, LogFile.LOG, "停车流程:" + queueCmd.LicenseNum + "停车完成,状态复位");
             UILogServer.ins.info("停车流程:" + queueCmd.LicenseNum + "停车完成,状态复位");
             //释放机械手与激光
             if (lmToBeReleased != null)
@@ -1048,13 +1119,13 @@ namespace parkMonitor.server.CoreThread
             //释放机械手
             Robot.robot1.occupied = false;
             Robot.robot1.waitCount -= 1;
-            
+
             //释放缓冲位与车位,缓冲位ID暂用车位X代替
-            if (ParkingSpaceManager.ins == null || !ParkingSpaceManager.ins.ReleaseParkingSpace(ps.parkingSpaceID) || ParkingBufferManager.ins == null || !ParkingBufferManager.ins.ReleaseParkingBuffer(ps.parkingSpaceX))
+            if (ParkingSpaceManager.ins == null || !ParkingSpaceManager.ins.SetParkingSpace(ps.parkingSpaceID, 0) || ParkingBufferManager.ins == null || !ParkingBufferManager.ins.ReleaseParkingBuffer(ps.parkingSpaceX))
             {
                 Log.WriteLog(LogType.NOT_DATABASE, LogFile.ERROR, "车位异常,请检查"); UILogServer.ins.error("车位异常,请检查");
             }
-            Log.WriteLog(LogType.NOT_DATABASE,"取车流程:号牌:" + queueCmd.LicenseNum + "取车完成");
+            Log.WriteLog(LogType.NOT_DATABASE, "取车流程:号牌:" + queueCmd.LicenseNum + "取车完成");
             UILogServer.ins.info("取车流程:号牌:" + queueCmd.LicenseNum + "取车完成");
 
             //自动化测试用

+ 28 - 19
parkMonitor/server/CoreThread/CoreThreadTest2.cs

@@ -101,25 +101,13 @@ namespace parkMonitor.server.CoreThread
 
         public void BeginWorking()
         {
-
-            Command queueCmd = null;
+            Object lockObj = new object();
+            Command queueCmdRecord = null;
             while (!isClosing)
             {
                 if (initialized && EntityForCore.ins.globalStatus)
                 {
-                    if (queueCmd != null)
-                    {
-                        if (queueCmd.id / 6 == Robot.robot1.id && Robot.robot1.waitCount >= 2)
-                        {
-                            Thread.Sleep(10000);
-                            continue;
-                        }
-                        if (queueCmd.id / 6 == Robot.robot2.id && Robot.robot2.waitCount >= 2)
-                        {
-                            Thread.Sleep(10000);
-                            continue;
-                        }
-                    }
+                    Command queueCmd = null;
                     //等待系统总状态
                     Task getSysStatus = Task.Factory.StartNew(() =>
                     {
@@ -138,17 +126,38 @@ namespace parkMonitor.server.CoreThread
                         }
                     });
                     Task.WaitAll(getSysStatus, getCmd);
-                    //Command queueCmd = (Command)func.EndInvoke(result);
-                    Task.Factory.StartNew(() =>
+
+                    lock (lockObj)
                     {
-                        if (queueCmd.id == Robot.robot1.id)
+                        queueCmdRecord = (Command)queueCmd.Clone();
+                        
+                        //判断当前计数是否允许线程创建
+                        if (queueCmdRecord != null)
+                        {
+                            if (queueCmdRecord.id / 6 == Robot.robot1.id && Robot.robot1.waitCount >= 2)
+                            {
+                                Thread.Sleep(10000);
+                                continue;
+                            }
+                            if (queueCmdRecord.id / 6 == Robot.robot2.id && Robot.robot2.waitCount >= 2)
+                            {
+                                Thread.Sleep(10000);
+                                continue;
+                            }
+                        }
+                        //对依赖同一机械手的线程计数
+                        if (queueCmdRecord.id == Robot.robot1.id)
                         {
                             Robot.robot1.waitCount += 1;
                         }
-                        else if (queueCmd.id == Robot.robot2.id)
+                        else if (queueCmdRecord.id == Robot.robot2.id)
                         {
                             Robot.robot2.waitCount += 1;
                         }
+                    }
+
+                    Task.Factory.StartNew(() =>
+                    {
                         SimpleCMDFactory simpleCMDFactory = new SimpleCMDFactory();
                         AbstractCmd abstractCmd = simpleCMDFactory.createCmd(queueCmd);
                         abstractCmd.executeCmd(queueCmd);

+ 12 - 3
parkMonitor/server/CoreThread/SpaceManager.cs

@@ -104,6 +104,11 @@ namespace parkMonitor.server.CoreThread
                             lps.Add(enumer.Current.Key, enumer.Current.Value);
                         }
                     }
+                    //无空闲车位则退出
+                    if(lps.Count == 0)
+                    {
+                        return null;
+                    }
                     //分配车位
                     Parking_Space rps = new Parking_Space();
                     float min_dis_sq = 100000000; //初始10000单位距离
@@ -133,12 +138,16 @@ namespace parkMonitor.server.CoreThread
         /// </summary>
         /// <param name="parkingSpaceID"></param>
         /// <returns></returns>
-        public bool ReleaseParkingSpace(int parkingSpaceID)
+        public bool SetParkingSpace(int parkingSpaceID, int status)
         {
             if (CheckIfSpaceExist(parkingSpaceID))
             {
-                parkingSpaceStatusMap[parkingSpaceID].parkingSpaceState = 0;
-                return true;
+                if (parkingSpaceStatusMap[parkingSpaceID].parkingSpaceState != status)
+                {
+                    parkingSpaceStatusMap[parkingSpaceID].parkingSpaceState = status;
+                    return true;
+                }
+                else { return false; }
             }
             else
             {

+ 5 - 0
parkMonitor/view/menuBox/MenuBox.xaml.cs

@@ -144,6 +144,11 @@ namespace parkMonitor.view.util
                 Log.WriteLog(LogType.NOT_DATABASE, LogFile.INFO, "已重新启用远端DB");
             }
         }
+        /// <summary>
+        /// 控制面板,管理车位与缓冲位
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
         private void muControlPanel_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
         {
             ControlPanel.ins = new ControlPanel();