From 0d9d9d57793a3c44993bfc79c376c79063bc492c Mon Sep 17 00:00:00 2001 From: "SIC1016\\caipeilun" <123456> Date: Mon, 29 Jan 2024 11:18:07 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=89=8B=E5=8A=A8=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0-2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Aitex/Core/RT/DataCenter/DATA.cs | 10 ++++- .../Aitex/Core/RT/DataCenter/DataManager.cs | 20 ++++++++- .../Aitex/Core/RT/DataCenter/ICommonData.cs | 4 +- .../Common/DBCore/RuntimeDataRecorder.cs | 38 +++++++++--------- .../Common/DBCore/ThinknessDataRecorder.cs | 10 ++--- .../Resources/Images/add.png | Bin 0 -> 1043 bytes .../Resources/Images/delete.png | Bin 0 -> 1478 bytes .../Resources/Images/done.png | Bin 0 -> 892 bytes .../Resources/Images/down.png | Bin 0 -> 418 bytes .../Resources/Images/file.png | Bin 0 -> 1656 bytes .../Resources/Images/undone.png | Bin 0 -> 792 bytes .../Resources/Images/undonered.png | Bin 0 -> 840 bytes .../Resources/Images/up.png | Bin 0 -> 401 bytes 13 files changed, 55 insertions(+), 27 deletions(-) create mode 100644 MECF.Framework.UI.Client/Resources/Images/add.png create mode 100644 MECF.Framework.UI.Client/Resources/Images/delete.png create mode 100644 MECF.Framework.UI.Client/Resources/Images/done.png create mode 100644 MECF.Framework.UI.Client/Resources/Images/down.png create mode 100644 MECF.Framework.UI.Client/Resources/Images/file.png create mode 100644 MECF.Framework.UI.Client/Resources/Images/undone.png create mode 100644 MECF.Framework.UI.Client/Resources/Images/undonered.png create mode 100644 MECF.Framework.UI.Client/Resources/Images/up.png diff --git a/MECF.Framework.Common/Aitex/Core/RT/DataCenter/DATA.cs b/MECF.Framework.Common/Aitex/Core/RT/DataCenter/DATA.cs index f7ccf7b..4f22f47 100644 --- a/MECF.Framework.Common/Aitex/Core/RT/DataCenter/DATA.cs +++ b/MECF.Framework.Common/Aitex/Core/RT/DataCenter/DATA.cs @@ -53,7 +53,15 @@ namespace Aitex.Core.RT.DataCenter } } - public static object Poll(string paramName) + public static void CancelSubscribe(string moduleKey) + { + if (InnerDataManager != null) + { + InnerDataManager.CancelSubscribe(moduleKey); + } + } + + public static object Poll(string paramName) { return (InnerDataManager == null) ? null : InnerDataManager.Poll(paramName); } diff --git a/MECF.Framework.Common/Aitex/Core/RT/DataCenter/DataManager.cs b/MECF.Framework.Common/Aitex/Core/RT/DataCenter/DataManager.cs index a700478..a0b98bc 100644 --- a/MECF.Framework.Common/Aitex/Core/RT/DataCenter/DataManager.cs +++ b/MECF.Framework.Common/Aitex/Core/RT/DataCenter/DataManager.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Threading.Tasks; +using System.Windows; using Aitex.Core.RT.ConfigCenter; using Aitex.Core.RT.DBCore; using Aitex.Core.RT.Log; @@ -193,7 +194,24 @@ namespace Aitex.Core.RT.DataCenter } } - public void Subscribe(string key, DataItem dataItem, SubscriptionAttribute.FLAG flag) + public void CancelSubscribe(string key) + { + if (_keyValueMap.ContainsKey(key)) + { + var value = new DataItem(() => ""); + _keyValueMap.TryRemove(key, out value); + } + if (_dbRecorderList.ContainsKey(key)) + { + lock (_locker) + { + _dbRecorderList.Remove(key); + } + } + + } + + public void Subscribe(string key, DataItem dataItem, SubscriptionAttribute.FLAG flag) { if (string.IsNullOrWhiteSpace(key)) { diff --git a/MECF.Framework.Common/Aitex/Core/RT/DataCenter/ICommonData.cs b/MECF.Framework.Common/Aitex/Core/RT/DataCenter/ICommonData.cs index 858bd66..746961f 100644 --- a/MECF.Framework.Common/Aitex/Core/RT/DataCenter/ICommonData.cs +++ b/MECF.Framework.Common/Aitex/Core/RT/DataCenter/ICommonData.cs @@ -12,7 +12,9 @@ namespace Aitex.Core.RT.DataCenter void Subscribe(string moduleKey, DataItem dataItem, SubscriptionAttribute.FLAG flag); - object Poll(string key); + void CancelSubscribe(string moduleKey); + + object Poll(string key); Dictionary PollData(IEnumerable keys); diff --git a/MECF.Framework.Common/MECF/Framework/Common/DBCore/RuntimeDataRecorder.cs b/MECF.Framework.Common/MECF/Framework/Common/DBCore/RuntimeDataRecorder.cs index ada7276..eee3e35 100644 --- a/MECF.Framework.Common/MECF/Framework/Common/DBCore/RuntimeDataRecorder.cs +++ b/MECF.Framework.Common/MECF/Framework/Common/DBCore/RuntimeDataRecorder.cs @@ -1,6 +1,7 @@ using System; using System.Data; using Aitex.Core.RT.DBCore; +using DocumentFormat.OpenXml.Office.Word; namespace MECF.Framework.Common.DBCore { @@ -26,29 +27,28 @@ namespace MECF.Framework.Common.DBCore } } - public static void UpdateElapseTimePM(string pmName, int minutes) + public static void UpdateElapseTimePM(string pmName, int second) { - string cmdText = $"Select \"guid\",\"elapse_minutes\" from \"runtime_data\" where \"ispm\"='true' and \"device_name\"='{pmName}';"; + string cmdText = $"Select \"Process_Seconds\" from \"runtime_data\" where \"Module\"='{pmName}';"; DataSet dataSet = DB.ExecuteDataSet(cmdText); - if (dataSet != null && dataSet.Tables != null && dataSet.Tables[0].Rows.Count > 0) + if (dataSet != null && dataSet.Tables != null && dataSet.Tables.Count == 1 && dataSet.Tables[0].Rows.Count == 1) { - cmdText = ""; - for (int i = 0; i < dataSet.Tables[0].Rows.Count; i++) - { - long num = Convert.ToInt64(dataSet.Tables[0].Rows[i]["elapse_minutes"].ToString()) + minutes; - string arg = dataSet.Tables[0].Rows[i]["guid"].ToString(); - cmdText += $"Update \"runtime_data\" set \"elapse_minutes\"='{num}' where \"guid\"='{arg}';"; - } - if (!string.IsNullOrEmpty(cmdText)) - { - DB.InsertSql(cmdText); - } - } + long num = Convert.ToInt64(dataSet.Tables[0].Rows[0]["Process_Seconds"].ToString()) + second; + cmdText = $"Update \"runtime_data\" set \"Process_Seconds\"='{num}' where \"Module\"='{pmName}';"; + DB.ExecuteNonQuery(cmdText); + } else { - cmdText = $"INSERT INTO \"runtime_data\" (\"guid\", \"device_name\", \"set_minutes\" , \"elapse_minutes\", \"ispm\" )VALUES ('{Guid.NewGuid()}', '{pmName}', {0}, {minutes}, 'true');"; - DB.InsertSql(cmdText); - } + cmdText = $"INSERT INTO \"runtime_data\" ( \"Module\", \"Process_Seconds\")VALUES ('{pmName}',{second});"; + DB.ExecuteNonQuery(cmdText); + } } - } + + public static void ResetElapseTimePM(string pmName) + { + string cmdText = $"Update \"runtime_data\" set \"Process_Seconds\"='{0}' where \"Module\"='{pmName}';"; + DB.ExecuteNonQuery(cmdText); + } + + } } diff --git a/MECF.Framework.Common/MECF/Framework/Common/DBCore/ThinknessDataRecorder.cs b/MECF.Framework.Common/MECF/Framework/Common/DBCore/ThinknessDataRecorder.cs index e10ef84..cb949d3 100644 --- a/MECF.Framework.Common/MECF/Framework/Common/DBCore/ThinknessDataRecorder.cs +++ b/MECF.Framework.Common/MECF/Framework/Common/DBCore/ThinknessDataRecorder.cs @@ -11,11 +11,11 @@ namespace MECF.Framework.Common.DBCore DB.InsertSql(sql); } - public static void InsertPMThinkness(string pmName, int coating1, int max1, int coating2, int max2) + public static void InsertPMThinkness(string startdate, string pmName, double thickness) { - string text = Guid.NewGuid().ToString(); - string sql = $"INSERT INTO \"pm_thickness_data\"(\"guid\", \"pm_name\", \"coating1\", \"max1\", \"coating2\", \"max2\") VALUES ('{text}', '{pmName}', '{coating1}', '{max1}', '{coating2}', '{max2}');"; - DB.InsertSql(sql); - } + string sql = $"INSERT INTO \"pm_thickness_data\"(\"startdate\", \"pm_name\", \"thickness\") VALUES ('{startdate}', '{pmName}', '{thickness}');"; + DB.ExecuteNonQuery(sql); + + } } } diff --git a/MECF.Framework.UI.Client/Resources/Images/add.png b/MECF.Framework.UI.Client/Resources/Images/add.png new file mode 100644 index 0000000000000000000000000000000000000000..cff0ccd7552ababf9ab70edf18b34717f37ec277 GIT binary patch literal 1043 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 A1ONa4 literal 0 HcmV?d00001 diff --git a/MECF.Framework.UI.Client/Resources/Images/done.png b/MECF.Framework.UI.Client/Resources/Images/done.png new file mode 100644 index 0000000000000000000000000000000000000000..d3bf2390c09f5d3c8415ef62b6d570f6737e4abf GIT binary patch literal 892 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 literal 0 HcmV?d00001