From b5234c5ab1e9e6826b8d8fc1e95fa752aaa40b74 Mon Sep 17 00:00:00 2001
From: chr <chr@mailcom>
Date: 星期六, 02 十一月 2024 10:56:50 +0800
Subject: [PATCH] 优化程序
---
PdmSwPlugin.PDM/PdmControl.xaml.cs | 364 ++++++++++++++++++++++++++++++++++++++-------------
1 files changed, 272 insertions(+), 92 deletions(-)
diff --git a/PdmSwPlugin.PDM/PdmControl.xaml.cs b/PdmSwPlugin.PDM/PdmControl.xaml.cs
index 6f5a86b..6e6148a 100644
--- a/PdmSwPlugin.PDM/PdmControl.xaml.cs
+++ b/PdmSwPlugin.PDM/PdmControl.xaml.cs
@@ -39,6 +39,7 @@
using System.Windows.Input;
using NPOI.POIFS.Properties;
using NPOI.POIFS.Crypt;
+using System.Threading.Tasks.Schedulers;
namespace PdmSwPlugin.PDM
{
@@ -144,11 +145,11 @@
this.Warning("璇锋墦寮�涓�寮犲浘绾�");
return new ObservableCollection<PdmBom>();
}
- if (7 == doc.GetBlockingState())
- {
- this.Warning("璇风瓑寰呮枃妗e姞杞藉畬姣�");
- return new ObservableCollection<PdmBom>();
- }
+ //if (7 == doc.GetBlockingState())
+ //{
+ // this.Warning("璇风瓑寰呮枃妗e姞杞藉畬姣�");
+ // return new ObservableCollection<PdmBom>();
+ //}
DateTime beforeDT = DateTime.Now;
@@ -896,7 +897,7 @@
public Dictionary<string, DrawInfo> GetAllProperties(List<string> ErrMsgs)
{
- Dictionary<string, DrawInfo> result = new Dictionary<string, DrawInfo>();
+ ConcurrentDictionary<string, DrawInfo> result = new ConcurrentDictionary<string, DrawInfo>();
PdmBom topBom = model.BomTree[0];
CountdownEvent counter = new CountdownEvent(1);
_ = ThreadPool.QueueUserWorkItem(
@@ -906,7 +907,65 @@
);
counter.Wait();
counter.Dispose();
- return result;
+ return new Dictionary<string, DrawInfo>(result);
+ }
+
+ /// <summary>
+ /// 鑾峰彇鍏ㄩ儴灞炴��
+ /// </summary>
+ /// <param name="param"></param>
+ public void GetAll(object param)
+ {
+ object[] datas = param as object[];
+ PdmBom bom = (PdmBom)datas[0];
+ ModelDoc2 sldDoc = bom.doc;
+ Component2 component = bom.component;
+ ConcurrentDictionary<string, DrawInfo> result = (ConcurrentDictionary<string, DrawInfo>)datas[1];
+ CountdownEvent counter = (CountdownEvent)datas[2];
+ List<string> ErrMsgs = (List<string>)datas[3];
+ int level = (int)datas[4];
+ try
+ {
+ counter.TryAddCount();
+ string filepath = bom.partNo;
+
+
+ if (result.ContainsKey(filepath))
+ {
+ return;
+ }
+
+ if (!bom.skipCheck)
+ {
+ result[filepath] = GetSingleDrawInfo(bom);
+ }
+
+ ObservableCollection<PdmBom> children = bom.modules;
+ if (children != null)
+ {
+ foreach (PdmBom child in children)
+ {
+ _ = ThreadPool.QueueUserWorkItem(
+ new WaitCallback(GetAll),
+ new object[] { child, result, counter, ErrMsgs, 1 });
+ }
+ }
+ MaskAdorner.ShowMessage(content, filepath);
+ }
+ catch (Exception e)
+ {
+ bom.drawInfo.checkRuleResult = 2;
+ bom.drawInfo.errMessages = new List<string> { e.Message };
+ Logger.Error($"V{PdmUser.LoginUser.pluginVersion},[{bom.filePath}] Read MASS Properies Failed.", e);
+ }
+ finally
+ {
+ counter.Signal();
+ if (level == 0)
+ {
+ counter.Signal();
+ }
+ }
}
/// <summary>
@@ -926,6 +985,7 @@
Dictionary<string, string> allProperties = new Dictionary<string, string>();
allProperties["鐗╂枡鍨嬪彿"] = bom.partModel;
DrawInfo drawInfo = bom._drawInfo;
+ drawInfo.isHidden = bom.isHidden;
drawInfo.allProperties = allProperties;
allProperties["鍘嬬缉"] = bom.suppressed.ToString();
allProperties["杞婚噺鍖�"] = bom.lightWeight.ToString();
@@ -947,7 +1007,7 @@
// 宸ョ▼鍥句竴鑷存�ф鏌�
allProperties["宸ョ▼鍥炬槸鍚﹀瓨鍦�"] = drawExists.ToString();
allProperties["md5"] = bom.localD3Md5;
- if (bom.lost || sldDoc == null)
+ if (bom.lost || bom.BomInfo.isHidden || sldDoc == null)
{
allProperties["鍥剧焊鏄惁瀛樺湪"] = "false";
return drawInfo;
@@ -1005,17 +1065,28 @@
return drawInfo;
}
- /// <summary>
- /// 鑾峰彇鍏ㄩ儴灞炴��
- /// </summary>
- /// <param name="param"></param>
- public void GetAll(object param)
+ public Dictionary<string, DrawInfo> GetAllPropertiesByTask(List<string> ErrMsgs)
+ {
+ ConcurrentDictionary<string, DrawInfo> result = new ConcurrentDictionary<string, DrawInfo>();
+ PdmBom topBom = model.BomTree[0];
+ CountdownEvent counter = new CountdownEvent(1);
+ Task.Run(() =>
+ {
+ GetAllByTask(new object[] {
+ topBom, result, counter, ErrMsgs, 0 });
+ });
+ counter.Wait();
+ counter.Dispose();
+ return new Dictionary<string, DrawInfo>(result);
+ }
+
+ public void GetAllByTask(object param)
{
object[] datas = param as object[];
PdmBom bom = (PdmBom)datas[0];
ModelDoc2 sldDoc = bom.doc;
Component2 component = bom.component;
- Dictionary<string, DrawInfo> result = (Dictionary<string, DrawInfo>)datas[1];
+ ConcurrentDictionary<string, DrawInfo> result = (ConcurrentDictionary<string, DrawInfo>)datas[1];
CountdownEvent counter = (CountdownEvent)datas[2];
List<string> ErrMsgs = (List<string>)datas[3];
int level = (int)datas[4];
@@ -1023,24 +1094,34 @@
{
counter.TryAddCount();
string filepath = bom.partNo;
- if (result.ContainsKey(filepath))
+ lock (result)
{
- return;
+ if (result.ContainsKey(filepath))
+ {
+ if (bom.isHidden)
+ {
+ result[filepath].isHidden = true;
+ }
+ return;
+ }
+ if (!bom.skipCheck)
+ {
+ result[filepath] = GetSingleDrawInfo(bom);
+ }
}
- if (!bom.skipCheck)
- {
- result[filepath] = GetSingleDrawInfo(bom);
- }
+
+
ObservableCollection<PdmBom> children = bom.modules;
if (children != null)
{
foreach (PdmBom child in children)
{
- _ = ThreadPool.QueueUserWorkItem(
- new WaitCallback(GetAll),
- new object[] { child, result, counter, ErrMsgs, 1 });
+ Task.Run(() =>
+ {
+ GetAllByTask(new object[] { child, result, counter, ErrMsgs, 1 });
+ });
}
}
MaskAdorner.ShowMessage(content, filepath);
@@ -1054,7 +1135,10 @@
finally
{
counter.Signal();
- if (level == 0) counter.Signal();
+ if (level == 0)
+ {
+ counter.Signal();
+ }
}
}
@@ -1096,78 +1180,127 @@
return allSuccess;
}
- public void sb(dynamic[] datas) {
- /*Dictionary<string, DrawInfo> properties = datas[0];
- string key = datas[1];
- KeyValuePair<string, DrawInfo> property = datas[2];
- List<string> temp = datas[3];
- CountdownEvent counter = datas[4];
- try
- {
-
- int iii, ref bool allSuccess
-
- Logger.Info($"{key} checking rule...");
- iii++;
- Result<DrawInfo> result = Client.PostSyncAction<DrawInfo>(property.Value, "wpf/bom/openApi/checkRuleSingle");
- DrawInfo checkResult = result.HandleResult();
- properties[key].checkRuleResult = checkResult.checkRuleResult;
- properties[key].errMessages = checkResult.errMessages;
- var msgs = checkResult.errMessages;
- if (!properties[key].HistoryData && !checkResult.checkRuleOk)
- {
- allSuccess = false;
- }
-
- if (!properties[key].HistoryData && msgs != null && msgs.Count > 0)
- {
- lock (temp)
- {
- foreach (string msg in msgs)
- {
- temp.Add($"鐗╂枡銆恵key}銆戞湭閫氳繃瑙勫垯妫�鏌ワ紒{msg}");
- }
- }
- }
- MaskAdorner.ShowMessage(content, $"鐗╂枡銆恵key}銆戞鏌ュ畬鎴�");
- }
- catch (Exception ex)
- {
- properties[key].checkRuleResult = 2;
- properties[key].errMessages = new List<string> { "鍙戣捣妫�鏌ュけ璐ワ紝璇烽噸璇�" };
- lock (temp)
- {
- temp.Add($"鐗╂枡銆恵key}銆戝彂璧锋鏌ュけ璐ワ紝璇烽噸璇�");
- }
- allSuccess = false;
- MaskAdorner.ShowMessage(content, $"鐗╂枡銆恵key}銆戞鏌ュ畬鎴�");
- }
- finally
- {
- counter.Signal();
- }*/
- }
-
public bool DoCheckRuleAsync(out List<string> messages)
{
var temp = new List<string>();
bool allSuccess = true;
- Dictionary<string, DrawInfo> properties = GetAllProperties(temp);
+ Dictionary<string, DrawInfo> properties = GetAllPropertiesByTask(temp);
MaskAdorner.ShowMessage(content, "姝e湪璇锋眰鏁版嵁...");
- var factory = LimitedConcurrencyLevelTaskScheduler.Factory;
+ // var factory = LimitedConcurrencyLevelTaskScheduler.Factory;
CountdownEvent counter = new CountdownEvent(properties.Count);
- int iii = 1;
+ int iii = 0;
foreach (KeyValuePair<string, DrawInfo> property in properties)
{
- string key = property.Key;
- _ = ThreadPool.QueueUserWorkItem(
- (WaitCallback)delegate
+ /// 杩欎釜鏂规硶鏈�蹇紝浣嗕笉濂界鎺э紝鍥犱负涓嶇煡閬撳睘鎬у瓧鍏告湁澶氬ぇ
+ Task.Run(() =>
{
-
+ string key = property.Key;
+ iii++;
try
{
Logger.Error($"{key} checking rule...");
- iii++;
+ Result<DrawInfo> result = Client.PostSyncAction<DrawInfo>(property.Value, "wpf/bom/openApi/checkRuleSingle");
+ DrawInfo checkResult = result.HandleResult();
+ properties[key].checkRuleResult = checkResult.checkRuleResult;
+ properties[key].errMessages = checkResult.errMessages;
+ var msgs = checkResult.errMessages;
+ if (!properties[key].HistoryData && (!checkResult.checkRuleOk||property.Value.isHidden))
+ {
+ allSuccess = false;
+ }
+
+ if (!properties[key].HistoryData)
+ {
+ lock (temp)
+ {
+ if (property.Value.isHidden)
+ {
+ temp.Add($"鐗╂枡銆恵key}銆戣璁剧疆涓洪殣钘�!");
+ }
+ if (msgs != null && msgs.Count > 0)
+ {
+ foreach (string msg in msgs)
+ {
+ temp.Add($"鐗╂枡銆恵key}銆戞湭閫氳繃瑙勫垯妫�鏌ワ紒{msg}");
+ }
+ }
+ }
+ }
+ MaskAdorner.ShowMessage(content, $"鐗╂枡銆恵key}銆戞鏌ュ畬鎴�");
+ }
+ catch (Exception ex)
+ {
+ properties[key].checkRuleResult = 2;
+ properties[key].errMessages = new List<string> { "鍙戣捣妫�鏌ュけ璐ワ紝璇烽噸璇�" };
+ lock (temp)
+ {
+ temp.Add($"鐗╂枡銆恵key}銆戝彂璧锋鏌ュけ璐ワ紝璇烽噸璇�");
+ }
+ allSuccess = false;
+ MaskAdorner.ShowMessage(content, $"鐗╂枡銆恵key}銆戞鏌ュ畬鎴�");
+ }
+ finally
+ {
+ counter.Signal();
+ }
+ });
+
+ //LimitedConcurrencyLevelTaskScheduler scheduler = new LimitedConcurrencyLevelTaskScheduler(int.MaxValue);
+ //Task.Factory.StartNew(() => {
+ // string key = property.Key;
+ // iii++;
+ // try
+ // {
+ // Logger.Error($"{key} checking rule...");
+ // Result<DrawInfo> result = Client.PostSyncAction<DrawInfo>(property.Value, "wpf/bom/openApi/checkRuleSingle");
+ // DrawInfo checkResult = result.HandleResult();
+ // properties[key].checkRuleResult = checkResult.checkRuleResult;
+ // properties[key].errMessages = checkResult.errMessages;
+ // var msgs = checkResult.errMessages;
+ // if (!properties[key].HistoryData && !checkResult.checkRuleOk)
+ // {
+ // allSuccess = false;
+ // }
+
+ // if (!properties[key].HistoryData && msgs != null && msgs.Count > 0)
+ // {
+ // lock (temp)
+ // {
+ // foreach (string msg in msgs)
+ // {
+ // temp.Add($"鐗╂枡銆恵key}銆戞湭閫氳繃瑙勫垯妫�鏌ワ紒{msg}");
+ // }
+ // }
+ // }
+ // MaskAdorner.ShowMessage(content, $"鐗╂枡銆恵key}銆戞鏌ュ畬鎴�");
+ // }
+ // catch (Exception ex)
+ // {
+ // properties[key].checkRuleResult = 2;
+ // properties[key].errMessages = new List<string> { "鍙戣捣妫�鏌ュけ璐ワ紝璇烽噸璇�" };
+ // lock (temp)
+ // {
+ // temp.Add($"鐗╂枡銆恵key}銆戝彂璧锋鏌ュけ璐ワ紝璇烽噸璇�");
+ // }
+ // allSuccess = false;
+ // MaskAdorner.ShowMessage(content, $"鐗╂枡銆恵key}銆戞鏌ュ畬鎴�");
+ // }
+ // finally
+ // {
+ // counter.Signal();
+ // }
+ //}, CancellationToken.None, TaskCreationOptions.None, scheduler);
+
+
+ /// 涓嬮潰涓や釜閮藉湪绠℃帶Task鏁伴噺锛屼絾杩樻槸寰堟參
+ /*string key = property.Key;
+ _ = ThreadPool.QueueUserWorkItem(
+ (WaitCallback)delegate
+ {
+ iii++;
+ try
+ {
+ Logger.Error($"{key} checking rule...");
Result<DrawInfo> result = Client.PostSyncAction<DrawInfo>(property.Value, "wpf/bom/openApi/checkRuleSingle");
DrawInfo checkResult = result.HandleResult();
properties[key].checkRuleResult = checkResult.checkRuleResult;
@@ -1205,12 +1338,53 @@
{
counter.Signal();
}
- });
+ });*/
- /* factory.StartNew(() =>
- {
+ //factory.StartNew(() =>
+ //{
+ // string key = property.Key;
+ // iii++;
+ // try
+ // {
+ // Logger.Error($"{key} checking rule...");
+ // Result<DrawInfo> result = Client.PostSyncAction<DrawInfo>(property.Value, "wpf/bom/openApi/checkRuleSingle");
+ // DrawInfo checkResult = result.HandleResult();
+ // properties[key].checkRuleResult = checkResult.checkRuleResult;
+ // properties[key].errMessages = checkResult.errMessages;
+ // var msgs = checkResult.errMessages;
+ // if (!properties[key].HistoryData && !checkResult.checkRuleOk)
+ // {
+ // allSuccess = false;
+ // }
- });*/
+ // if (!properties[key].HistoryData && msgs != null && msgs.Count > 0)
+ // {
+ // lock (temp)
+ // {
+ // foreach (string msg in msgs)
+ // {
+ // temp.Add($"鐗╂枡銆恵key}銆戞湭閫氳繃瑙勫垯妫�鏌ワ紒{msg}");
+ // }
+ // }
+ // }
+ // MaskAdorner.ShowMessage(content, $"鐗╂枡銆恵key}銆戞鏌ュ畬鎴�");
+ // }
+ // catch (Exception ex)
+ // {
+ // properties[key].checkRuleResult = 2;
+ // properties[key].errMessages = new List<string> { "鍙戣捣妫�鏌ュけ璐ワ紝璇烽噸璇�" };
+ // lock (temp)
+ // {
+ // temp.Add($"鐗╂枡銆恵key}銆戝彂璧锋鏌ュけ璐ワ紝璇烽噸璇�");
+ // }
+ // allSuccess = false;
+ // MaskAdorner.ShowMessage(content, $"鐗╂枡銆恵key}銆戞鏌ュ畬鎴�");
+ // }
+ // finally
+ // {
+ // counter.Signal();
+ // }
+ //});
}
counter.Wait();
counter.Dispose();
@@ -1245,7 +1419,7 @@
try
{
RefreshBomList(SwApp.IActiveDoc2);
- if (!DoCheckRule(out List<string> msgs))
+ if (!DoCheckRuleAsync(out List<string> msgs))
{
Dispatcher.Invoke(() =>
{
@@ -1615,13 +1789,19 @@
return;
}
- if (bom.checkRuleOk)
+ if (bom.checkRuleOk && !bom.isHidden)
{
this.Show("瑙勫垯妫�鏌ラ�氳繃");
}
else
{
- MultiExWindow exWin = new MultiExWindow(this, "妫�鏌ョ粨鏋�", bom.drawInfo.errMessages);
+ List<string> errs = new List<string>();
+ if (bom.isHidden)
+ {
+ errs.Add("鏂囨。琚缃负闅愯棌");
+ }
+ errs.AddRange(bom.drawInfo.errMessages);
+ MultiExWindow exWin = new MultiExWindow(this, "妫�鏌ョ粨鏋�", errs);
exWin.ShowDialog();
}
}
@@ -1817,7 +1997,7 @@
{
throw new CantCheckInException(new List<string> { "璇锋墦寮�涓�寮犲浘绾�" });
}
- DoCheckRule(out _);
+ DoCheckRuleAsync(out _);
// 绛涢�夋墍鏈夊湪鐗╂枡鏄庣粏琛ㄤ腑锛屼笉璺宠繃妫�鏌ュ苟涓旀鏌ユ湭閫氳繃鐨勶紝绫诲瀷鏄姞宸ヤ欢鐨勬湭閫氳繃瀹℃牳鐨勶紝鍔犲伐浠跺鏍搁�氳繃鐨勪絾鍥剧焊鍙樻洿鐨�
List<string> errs = model.bomTreeReader.CacheList.Select(b => b.NeedStopCheckIn())
.Where(s => s != null).ToList();
--
Gitblit v1.9.1