From 31a636e735a0addc56e4f4527f500b7aa0874eb5 Mon Sep 17 00:00:00 2001
From: chr <chr@mailcom>
Date: 星期五, 03 一月 2025 11:21:46 +0800
Subject: [PATCH] 改了一大堆;

---
 PdmSwPlugin.Main/SwAddIn/MainControl.cs                  |   28 
 .vs/SwPlugin/v17/DocumentLayout.backup.json              |  190 +-------
 PdmSwPlugin.Common/Util/CustomPropertyUtil.cs            |    5 
 PdmSwPlugin.Common/Util/Pdm/BomTreeReader.cs             |   38 +
 PdmSwPlugin.Common/Control/RichHisWindow.xaml.cs         |    2 
 PdmSwPlugin.Common/Entity/Pdm/PdmBom.cs                  |  111 +++-
 InnoSetupScript/PdmSwPlugin.iss                          |    2 
 PdmSwPlugin.Main/EventHandler/BaseAttacher.cs            |   68 ++
 PdmSwPlugin.PropertySetting/CommonSettingControl.xaml.cs |  136 ++++-
 PdmSw/SwAddin.cs                                         |    7 
 PdmSwPlugin.DrawApprove/DrawApprove.xaml.cs              |   32 +
 PdmSwPlugin.Common/Util/OpenDocContext.cs                |   10 
 PdmSwPlugin.Main/Constant/PluginConst.cs                 |    2 
 PdmSwPlugin.Common/BomIniter/NameUtil.cs                 |    1 
 PdmSwPlugin.Common/Util/UI/MultiExWindow.xaml.cs         |   11 
 PdmSwPlugin.PDM/Model/PdmControlModel.cs                 |   39 +
 PdmSwPlugin.PDM/PdmControl.xaml.cs                       |  325 +++++++++-----
 .vs/SwPlugin/v17/DocumentLayout.json                     |  190 +-------
 PdmSwPlugin.Common/BomIniter/YwtBomIniter.cs             |    2 
 PdmSwPlugin.PDM/PdmControl.xaml                          |   98 +++
 20 files changed, 716 insertions(+), 581 deletions(-)

diff --git a/.vs/SwPlugin/v17/DocumentLayout.backup.json b/.vs/SwPlugin/v17/DocumentLayout.backup.json
index a0bc88a..6ae4a6d 100644
--- a/.vs/SwPlugin/v17/DocumentLayout.backup.json
+++ b/.vs/SwPlugin/v17/DocumentLayout.backup.json
@@ -3,190 +3,64 @@
   "WorkspaceRootPath": "D:\\Workspace\\PdmSwPlugin2\\",
   "Documents": [
     {
-      "AbsoluteMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.main\\constant\\pluginconst.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
-      "RelativeMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|solutionrelative:pdmswplugin.main\\constant\\pluginconst.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+      "AbsoluteMoniker": "D:0:0:{713278FD-1A24-41A4-86B7-1072E7DB9E39}|PdmSwPlugin.PropertySetting\\PdmSwPlugin.PropertySetting.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.propertysetting\\panel\\jgjpartpanel.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+      "RelativeMoniker": "D:0:0:{713278FD-1A24-41A4-86B7-1072E7DB9E39}|PdmSwPlugin.PropertySetting\\PdmSwPlugin.PropertySetting.csproj|solutionrelative:pdmswplugin.propertysetting\\panel\\jgjpartpanel.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
     },
     {
-      "AbsoluteMoniker": "D:0:0:{1033FBD8-8700-4CD0-808A-BB97DB057A6B}|PdmSwPlugin.PDM\\PdmSwPlugin.PDM.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.pdm\\pdmcontrol.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
-      "RelativeMoniker": "D:0:0:{1033FBD8-8700-4CD0-808A-BB97DB057A6B}|PdmSwPlugin.PDM\\PdmSwPlugin.PDM.csproj|solutionrelative:pdmswplugin.pdm\\pdmcontrol.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+      "AbsoluteMoniker": "D:0:0:{713278FD-1A24-41A4-86B7-1072E7DB9E39}|PdmSwPlugin.PropertySetting\\PdmSwPlugin.PropertySetting.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.propertysetting\\commonsettingcontrol.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+      "RelativeMoniker": "D:0:0:{713278FD-1A24-41A4-86B7-1072E7DB9E39}|PdmSwPlugin.PropertySetting\\PdmSwPlugin.PropertySetting.csproj|solutionrelative:pdmswplugin.propertysetting\\commonsettingcontrol.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
     },
     {
-      "AbsoluteMoniker": "D:0:0:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.common\\entity\\pdm\\pdmbom.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
-      "RelativeMoniker": "D:0:0:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|solutionrelative:pdmswplugin.common\\entity\\pdm\\pdmbom.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
-    },
-    {
-      "AbsoluteMoniker": "D:0:0:{1033FBD8-8700-4CD0-808A-BB97DB057A6B}|PdmSwPlugin.PDM\\PdmSwPlugin.PDM.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.pdm\\pdmcontrol.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
-      "RelativeMoniker": "D:0:0:{1033FBD8-8700-4CD0-808A-BB97DB057A6B}|PdmSwPlugin.PDM\\PdmSwPlugin.PDM.csproj|solutionrelative:pdmswplugin.pdm\\pdmcontrol.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
-    },
-    {
-      "AbsoluteMoniker": "D:0:0:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.common\\util\\pdm\\bomtreereader.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
-      "RelativeMoniker": "D:0:0:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|solutionrelative:pdmswplugin.common\\util\\pdm\\bomtreereader.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
-    },
-    {
-      "AbsoluteMoniker": "D:0:0:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.common\\bominiter\\ywtbominiter.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
-      "RelativeMoniker": "D:0:0:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|solutionrelative:pdmswplugin.common\\bominiter\\ywtbominiter.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
-    },
-    {
-      "AbsoluteMoniker": "D:0:0:{3AEC586C-B22A-4ADB-B4AB-10AA660F79EC}|Md5Reader\\Md5Reader.csproj|D:\\Workspace\\PdmSwPlugin2\\md5reader\\mainwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
-      "RelativeMoniker": "D:0:0:{3AEC586C-B22A-4ADB-B4AB-10AA660F79EC}|Md5Reader\\Md5Reader.csproj|solutionrelative:md5reader\\mainwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
-    },
-    {
-      "AbsoluteMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.main\\maincontrol.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
-      "RelativeMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|solutionrelative:pdmswplugin.main\\maincontrol.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
-    },
-    {
-      "AbsoluteMoniker": "D:0:0:{CB3551F6-0C4A-4537-9A04-1E40CD475479}|SolidWorksListener\\SolidWorksListener.csproj|D:\\Workspace\\PdmSwPlugin2\\solidworkslistener\\listener.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
-      "RelativeMoniker": "D:0:0:{CB3551F6-0C4A-4537-9A04-1E40CD475479}|SolidWorksListener\\SolidWorksListener.csproj|solutionrelative:solidworkslistener\\listener.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
-    },
-    {
-      "AbsoluteMoniker": "D:0:0:{4536570F-AD3C-4D24-870A-63C9E9CE0FED}|WpfUI\\WpfUI.csproj|D:\\Workspace\\PdmSwPlugin2\\wpfui\\asyncattacher.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
-      "RelativeMoniker": "D:0:0:{4536570F-AD3C-4D24-870A-63C9E9CE0FED}|WpfUI\\WpfUI.csproj|solutionrelative:wpfui\\asyncattacher.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
-    },
-    {
-      "AbsoluteMoniker": "D:0:0:{7ACEDAA9-2DE8-4485-837A-E7D58812A6DC}|PdmSw\\PdmSw.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmsw\\swaddin.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
-      "RelativeMoniker": "D:0:0:{7ACEDAA9-2DE8-4485-837A-E7D58812A6DC}|PdmSw\\PdmSw.csproj|solutionrelative:pdmsw\\swaddin.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+      "AbsoluteMoniker": "D:0:0:{713278FD-1A24-41A4-86B7-1072E7DB9E39}|PdmSwPlugin.PropertySetting\\PdmSwPlugin.PropertySetting.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.propertysetting\\panel\\jgjpartpanel.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
+      "RelativeMoniker": "D:0:0:{713278FD-1A24-41A4-86B7-1072E7DB9E39}|PdmSwPlugin.PropertySetting\\PdmSwPlugin.PropertySetting.csproj|solutionrelative:pdmswplugin.propertysetting\\panel\\jgjpartpanel.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
     }
   ],
   "DocumentGroupContainers": [
     {
-      "Orientation": 0,
+      "Orientation": 1,
       "VerticalTabListWidth": 256,
       "DocumentGroups": [
         {
-          "DockedWidth": 200,
-          "SelectedChildIndex": 4,
+          "DockedHeight": 530,
+          "SelectedChildIndex": 1,
           "Children": [
             {
               "$type": "Document",
-              "DocumentIndex": 5,
-              "Title": "YwtBomIniter.cs",
-              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\BomIniter\\YwtBomIniter.cs",
-              "RelativeDocumentMoniker": "PdmSwPlugin.Common\\BomIniter\\YwtBomIniter.cs",
-              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\BomIniter\\YwtBomIniter.cs",
-              "RelativeToolTip": "PdmSwPlugin.Common\\BomIniter\\YwtBomIniter.cs",
-              "ViewState": "AgIAAEEAAAAAAAAAAAAUwBIAAAAXAAAAAAAAAA==",
-              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2024-10-31T09:13:45.395Z"
-            },
-            {
-              "$type": "Document",
-              "DocumentIndex": 3,
-              "Title": "PdmControl.xaml",
-              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PDM\\PdmControl.xaml",
-              "RelativeDocumentMoniker": "PdmSwPlugin.PDM\\PdmControl.xaml",
-              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PDM\\PdmControl.xaml",
-              "RelativeToolTip": "PdmSwPlugin.PDM\\PdmControl.xaml",
-              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
-              "WhenOpened": "2024-10-31T09:12:36.773Z"
-            },
-            {
-              "$type": "Document",
               "DocumentIndex": 1,
-              "Title": "PdmControl.xaml.cs",
-              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PDM\\PdmControl.xaml.cs",
-              "RelativeDocumentMoniker": "PdmSwPlugin.PDM\\PdmControl.xaml.cs",
-              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PDM\\PdmControl.xaml.cs",
-              "RelativeToolTip": "PdmSwPlugin.PDM\\PdmControl.xaml.cs",
-              "ViewState": "AgIAALUEAAAAAAAAAAAuwMUEAABAAAAAAAAAAA==",
+              "Title": "CommonSettingControl.xaml.cs",
+              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PropertySetting\\CommonSettingControl.xaml.cs",
+              "RelativeDocumentMoniker": "PdmSwPlugin.PropertySetting\\CommonSettingControl.xaml.cs",
+              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PropertySetting\\CommonSettingControl.xaml.cs",
+              "RelativeToolTip": "PdmSwPlugin.PropertySetting\\CommonSettingControl.xaml.cs",
+              "ViewState": "AgIAAAoBAAAAAAAAAAD4vx0BAAAgAAAAAAAAAA==",
               "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2024-10-31T08:50:14.505Z"
-            },
-            {
-              "$type": "Document",
-              "DocumentIndex": 4,
-              "Title": "BomTreeReader.cs",
-              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\Util\\Pdm\\BomTreeReader.cs",
-              "RelativeDocumentMoniker": "PdmSwPlugin.Common\\Util\\Pdm\\BomTreeReader.cs",
-              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\Util\\Pdm\\BomTreeReader.cs",
-              "RelativeToolTip": "PdmSwPlugin.Common\\Util\\Pdm\\BomTreeReader.cs",
-              "ViewState": "AgIAAPsAAAAAAAAAAAAUwBABAAAgAAAAAAAAAA==",
-              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2024-10-31T08:33:38.547Z"
+              "WhenOpened": "2025-01-02T06:15:07.965Z",
+              "EditorCaption": ""
             },
             {
               "$type": "Document",
               "DocumentIndex": 0,
-              "Title": "PluginConst.cs",
-              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\Constant\\PluginConst.cs",
-              "RelativeDocumentMoniker": "PdmSwPlugin.Main\\Constant\\PluginConst.cs",
-              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\Constant\\PluginConst.cs",
-              "RelativeToolTip": "PdmSwPlugin.Main\\Constant\\PluginConst.cs",
-              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAA==",
+              "Title": "JgjPartPanel.xaml.cs",
+              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PropertySetting\\Panel\\JgjPartPanel.xaml.cs",
+              "RelativeDocumentMoniker": "PdmSwPlugin.PropertySetting\\Panel\\JgjPartPanel.xaml.cs",
+              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PropertySetting\\Panel\\JgjPartPanel.xaml.cs",
+              "RelativeToolTip": "PdmSwPlugin.PropertySetting\\Panel\\JgjPartPanel.xaml.cs",
+              "ViewState": "AgIAAF4BAAAAAAAAAAAQwIABAABGAAAAAAAAAA==",
               "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2024-10-14T04:01:41.756Z",
+              "WhenOpened": "2025-01-02T06:10:11.494Z",
               "EditorCaption": ""
             },
             {
               "$type": "Document",
               "DocumentIndex": 2,
-              "Title": "PdmBom.cs",
-              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\Entity\\Pdm\\PdmBom.cs",
-              "RelativeDocumentMoniker": "PdmSwPlugin.Common\\Entity\\Pdm\\PdmBom.cs",
-              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\Entity\\Pdm\\PdmBom.cs",
-              "RelativeToolTip": "PdmSwPlugin.Common\\Entity\\Pdm\\PdmBom.cs",
-              "ViewState": "AgIAAIgAAAAAAAAAAAA+wJYAAAAdAAAAAAAAAA==",
-              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2024-10-31T08:32:38.632Z"
-            },
-            {
-              "$type": "Document",
-              "DocumentIndex": 6,
-              "Title": "MainWindow.xaml.cs",
-              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\Md5Reader\\MainWindow.xaml.cs",
-              "RelativeDocumentMoniker": "Md5Reader\\MainWindow.xaml.cs",
-              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\Md5Reader\\MainWindow.xaml.cs",
-              "RelativeToolTip": "Md5Reader\\MainWindow.xaml.cs",
-              "ViewState": "AgIAAAAAAAAAAAAAAAAAABAAAABDAAAAAAAAAA==",
-              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2024-10-30T02:39:22.183Z"
-            },
-            {
-              "$type": "Document",
-              "DocumentIndex": 7,
-              "Title": "MainControl.xaml.cs",
-              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\MainControl.xaml.cs",
-              "RelativeDocumentMoniker": "PdmSwPlugin.Main\\MainControl.xaml.cs",
-              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\MainControl.xaml.cs",
-              "RelativeToolTip": "PdmSwPlugin.Main\\MainControl.xaml.cs",
-              "ViewState": "AgIAAMAAAAAAAAAAAAAYwMoAAAAAAAAAAAAAAA==",
-              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2024-10-14T04:24:56.766Z"
-            },
-            {
-              "$type": "Document",
-              "DocumentIndex": 8,
-              "Title": "Listener.cs",
-              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\SolidWorksListener\\Listener.cs",
-              "RelativeDocumentMoniker": "SolidWorksListener\\Listener.cs",
-              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\SolidWorksListener\\Listener.cs",
-              "RelativeToolTip": "SolidWorksListener\\Listener.cs",
-              "ViewState": "AgIAANAAAAAAAAAAAADwv90AAAAiAAAAAAAAAA==",
-              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2024-10-14T03:42:50.289Z"
-            },
-            {
-              "$type": "Document",
-              "DocumentIndex": 9,
-              "Title": "AsyncAttacher.cs",
-              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\WpfUI\\AsyncAttacher.cs",
-              "RelativeDocumentMoniker": "WpfUI\\AsyncAttacher.cs",
-              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\WpfUI\\AsyncAttacher.cs",
-              "RelativeToolTip": "WpfUI\\AsyncAttacher.cs",
-              "ViewState": "AgIAAAAAAAAAAAAAAAAAAA8AAAAJAAAAAAAAAA==",
-              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2024-10-14T03:36:12.415Z"
-            },
-            {
-              "$type": "Document",
-              "DocumentIndex": 10,
-              "Title": "SwAddin.cs",
-              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSw\\SwAddin.cs",
-              "RelativeDocumentMoniker": "PdmSw\\SwAddin.cs",
-              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSw\\SwAddin.cs",
-              "RelativeToolTip": "PdmSw\\SwAddin.cs",
-              "ViewState": "AgIAABMBAAAAAAAAAAAkwCYBAAAkAAAAAAAAAA==",
-              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2024-10-14T01:09:55.509Z"
+              "Title": "JgjPartPanel.xaml",
+              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PropertySetting\\Panel\\JgjPartPanel.xaml",
+              "RelativeDocumentMoniker": "PdmSwPlugin.PropertySetting\\Panel\\JgjPartPanel.xaml",
+              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PropertySetting\\Panel\\JgjPartPanel.xaml",
+              "RelativeToolTip": "PdmSwPlugin.PropertySetting\\Panel\\JgjPartPanel.xaml",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
+              "WhenOpened": "2025-01-02T06:07:52.955Z",
+              "EditorCaption": ""
             }
           ]
         }
diff --git a/.vs/SwPlugin/v17/DocumentLayout.json b/.vs/SwPlugin/v17/DocumentLayout.json
index a0bc88a..6ae4a6d 100644
--- a/.vs/SwPlugin/v17/DocumentLayout.json
+++ b/.vs/SwPlugin/v17/DocumentLayout.json
@@ -3,190 +3,64 @@
   "WorkspaceRootPath": "D:\\Workspace\\PdmSwPlugin2\\",
   "Documents": [
     {
-      "AbsoluteMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.main\\constant\\pluginconst.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
-      "RelativeMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|solutionrelative:pdmswplugin.main\\constant\\pluginconst.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+      "AbsoluteMoniker": "D:0:0:{713278FD-1A24-41A4-86B7-1072E7DB9E39}|PdmSwPlugin.PropertySetting\\PdmSwPlugin.PropertySetting.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.propertysetting\\panel\\jgjpartpanel.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+      "RelativeMoniker": "D:0:0:{713278FD-1A24-41A4-86B7-1072E7DB9E39}|PdmSwPlugin.PropertySetting\\PdmSwPlugin.PropertySetting.csproj|solutionrelative:pdmswplugin.propertysetting\\panel\\jgjpartpanel.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
     },
     {
-      "AbsoluteMoniker": "D:0:0:{1033FBD8-8700-4CD0-808A-BB97DB057A6B}|PdmSwPlugin.PDM\\PdmSwPlugin.PDM.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.pdm\\pdmcontrol.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
-      "RelativeMoniker": "D:0:0:{1033FBD8-8700-4CD0-808A-BB97DB057A6B}|PdmSwPlugin.PDM\\PdmSwPlugin.PDM.csproj|solutionrelative:pdmswplugin.pdm\\pdmcontrol.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+      "AbsoluteMoniker": "D:0:0:{713278FD-1A24-41A4-86B7-1072E7DB9E39}|PdmSwPlugin.PropertySetting\\PdmSwPlugin.PropertySetting.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.propertysetting\\commonsettingcontrol.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+      "RelativeMoniker": "D:0:0:{713278FD-1A24-41A4-86B7-1072E7DB9E39}|PdmSwPlugin.PropertySetting\\PdmSwPlugin.PropertySetting.csproj|solutionrelative:pdmswplugin.propertysetting\\commonsettingcontrol.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
     },
     {
-      "AbsoluteMoniker": "D:0:0:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.common\\entity\\pdm\\pdmbom.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
-      "RelativeMoniker": "D:0:0:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|solutionrelative:pdmswplugin.common\\entity\\pdm\\pdmbom.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
-    },
-    {
-      "AbsoluteMoniker": "D:0:0:{1033FBD8-8700-4CD0-808A-BB97DB057A6B}|PdmSwPlugin.PDM\\PdmSwPlugin.PDM.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.pdm\\pdmcontrol.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
-      "RelativeMoniker": "D:0:0:{1033FBD8-8700-4CD0-808A-BB97DB057A6B}|PdmSwPlugin.PDM\\PdmSwPlugin.PDM.csproj|solutionrelative:pdmswplugin.pdm\\pdmcontrol.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
-    },
-    {
-      "AbsoluteMoniker": "D:0:0:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.common\\util\\pdm\\bomtreereader.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
-      "RelativeMoniker": "D:0:0:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|solutionrelative:pdmswplugin.common\\util\\pdm\\bomtreereader.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
-    },
-    {
-      "AbsoluteMoniker": "D:0:0:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.common\\bominiter\\ywtbominiter.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
-      "RelativeMoniker": "D:0:0:{E17EF6B6-EE83-45AA-B0C0-E3A097089E97}|PdmSwPlugin.Common\\PdmSwPlugin.Common.csproj|solutionrelative:pdmswplugin.common\\bominiter\\ywtbominiter.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
-    },
-    {
-      "AbsoluteMoniker": "D:0:0:{3AEC586C-B22A-4ADB-B4AB-10AA660F79EC}|Md5Reader\\Md5Reader.csproj|D:\\Workspace\\PdmSwPlugin2\\md5reader\\mainwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
-      "RelativeMoniker": "D:0:0:{3AEC586C-B22A-4ADB-B4AB-10AA660F79EC}|Md5Reader\\Md5Reader.csproj|solutionrelative:md5reader\\mainwindow.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
-    },
-    {
-      "AbsoluteMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmswplugin.main\\maincontrol.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
-      "RelativeMoniker": "D:0:0:{6E609A8C-583B-4607-A510-FA84218C4A31}|PdmSwPlugin.Main\\PdmSwPlugin.Main.csproj|solutionrelative:pdmswplugin.main\\maincontrol.xaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
-    },
-    {
-      "AbsoluteMoniker": "D:0:0:{CB3551F6-0C4A-4537-9A04-1E40CD475479}|SolidWorksListener\\SolidWorksListener.csproj|D:\\Workspace\\PdmSwPlugin2\\solidworkslistener\\listener.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
-      "RelativeMoniker": "D:0:0:{CB3551F6-0C4A-4537-9A04-1E40CD475479}|SolidWorksListener\\SolidWorksListener.csproj|solutionrelative:solidworkslistener\\listener.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
-    },
-    {
-      "AbsoluteMoniker": "D:0:0:{4536570F-AD3C-4D24-870A-63C9E9CE0FED}|WpfUI\\WpfUI.csproj|D:\\Workspace\\PdmSwPlugin2\\wpfui\\asyncattacher.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
-      "RelativeMoniker": "D:0:0:{4536570F-AD3C-4D24-870A-63C9E9CE0FED}|WpfUI\\WpfUI.csproj|solutionrelative:wpfui\\asyncattacher.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
-    },
-    {
-      "AbsoluteMoniker": "D:0:0:{7ACEDAA9-2DE8-4485-837A-E7D58812A6DC}|PdmSw\\PdmSw.csproj|D:\\Workspace\\PdmSwPlugin2\\pdmsw\\swaddin.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
-      "RelativeMoniker": "D:0:0:{7ACEDAA9-2DE8-4485-837A-E7D58812A6DC}|PdmSw\\PdmSw.csproj|solutionrelative:pdmsw\\swaddin.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+      "AbsoluteMoniker": "D:0:0:{713278FD-1A24-41A4-86B7-1072E7DB9E39}|PdmSwPlugin.PropertySetting\\PdmSwPlugin.PropertySetting.csproj|d:\\workspace\\pdmswplugin2\\pdmswplugin.propertysetting\\panel\\jgjpartpanel.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}",
+      "RelativeMoniker": "D:0:0:{713278FD-1A24-41A4-86B7-1072E7DB9E39}|PdmSwPlugin.PropertySetting\\PdmSwPlugin.PropertySetting.csproj|solutionrelative:pdmswplugin.propertysetting\\panel\\jgjpartpanel.xaml||{F11ACC28-31D1-4C80-A34B-F4E09D3D753C}"
     }
   ],
   "DocumentGroupContainers": [
     {
-      "Orientation": 0,
+      "Orientation": 1,
       "VerticalTabListWidth": 256,
       "DocumentGroups": [
         {
-          "DockedWidth": 200,
-          "SelectedChildIndex": 4,
+          "DockedHeight": 530,
+          "SelectedChildIndex": 1,
           "Children": [
             {
               "$type": "Document",
-              "DocumentIndex": 5,
-              "Title": "YwtBomIniter.cs",
-              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\BomIniter\\YwtBomIniter.cs",
-              "RelativeDocumentMoniker": "PdmSwPlugin.Common\\BomIniter\\YwtBomIniter.cs",
-              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\BomIniter\\YwtBomIniter.cs",
-              "RelativeToolTip": "PdmSwPlugin.Common\\BomIniter\\YwtBomIniter.cs",
-              "ViewState": "AgIAAEEAAAAAAAAAAAAUwBIAAAAXAAAAAAAAAA==",
-              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2024-10-31T09:13:45.395Z"
-            },
-            {
-              "$type": "Document",
-              "DocumentIndex": 3,
-              "Title": "PdmControl.xaml",
-              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PDM\\PdmControl.xaml",
-              "RelativeDocumentMoniker": "PdmSwPlugin.PDM\\PdmControl.xaml",
-              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PDM\\PdmControl.xaml",
-              "RelativeToolTip": "PdmSwPlugin.PDM\\PdmControl.xaml",
-              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
-              "WhenOpened": "2024-10-31T09:12:36.773Z"
-            },
-            {
-              "$type": "Document",
               "DocumentIndex": 1,
-              "Title": "PdmControl.xaml.cs",
-              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PDM\\PdmControl.xaml.cs",
-              "RelativeDocumentMoniker": "PdmSwPlugin.PDM\\PdmControl.xaml.cs",
-              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PDM\\PdmControl.xaml.cs",
-              "RelativeToolTip": "PdmSwPlugin.PDM\\PdmControl.xaml.cs",
-              "ViewState": "AgIAALUEAAAAAAAAAAAuwMUEAABAAAAAAAAAAA==",
+              "Title": "CommonSettingControl.xaml.cs",
+              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PropertySetting\\CommonSettingControl.xaml.cs",
+              "RelativeDocumentMoniker": "PdmSwPlugin.PropertySetting\\CommonSettingControl.xaml.cs",
+              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PropertySetting\\CommonSettingControl.xaml.cs",
+              "RelativeToolTip": "PdmSwPlugin.PropertySetting\\CommonSettingControl.xaml.cs",
+              "ViewState": "AgIAAAoBAAAAAAAAAAD4vx0BAAAgAAAAAAAAAA==",
               "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2024-10-31T08:50:14.505Z"
-            },
-            {
-              "$type": "Document",
-              "DocumentIndex": 4,
-              "Title": "BomTreeReader.cs",
-              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\Util\\Pdm\\BomTreeReader.cs",
-              "RelativeDocumentMoniker": "PdmSwPlugin.Common\\Util\\Pdm\\BomTreeReader.cs",
-              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\Util\\Pdm\\BomTreeReader.cs",
-              "RelativeToolTip": "PdmSwPlugin.Common\\Util\\Pdm\\BomTreeReader.cs",
-              "ViewState": "AgIAAPsAAAAAAAAAAAAUwBABAAAgAAAAAAAAAA==",
-              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2024-10-31T08:33:38.547Z"
+              "WhenOpened": "2025-01-02T06:15:07.965Z",
+              "EditorCaption": ""
             },
             {
               "$type": "Document",
               "DocumentIndex": 0,
-              "Title": "PluginConst.cs",
-              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\Constant\\PluginConst.cs",
-              "RelativeDocumentMoniker": "PdmSwPlugin.Main\\Constant\\PluginConst.cs",
-              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\Constant\\PluginConst.cs",
-              "RelativeToolTip": "PdmSwPlugin.Main\\Constant\\PluginConst.cs",
-              "ViewState": "AgIAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAA==",
+              "Title": "JgjPartPanel.xaml.cs",
+              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PropertySetting\\Panel\\JgjPartPanel.xaml.cs",
+              "RelativeDocumentMoniker": "PdmSwPlugin.PropertySetting\\Panel\\JgjPartPanel.xaml.cs",
+              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PropertySetting\\Panel\\JgjPartPanel.xaml.cs",
+              "RelativeToolTip": "PdmSwPlugin.PropertySetting\\Panel\\JgjPartPanel.xaml.cs",
+              "ViewState": "AgIAAF4BAAAAAAAAAAAQwIABAABGAAAAAAAAAA==",
               "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2024-10-14T04:01:41.756Z",
+              "WhenOpened": "2025-01-02T06:10:11.494Z",
               "EditorCaption": ""
             },
             {
               "$type": "Document",
               "DocumentIndex": 2,
-              "Title": "PdmBom.cs",
-              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\Entity\\Pdm\\PdmBom.cs",
-              "RelativeDocumentMoniker": "PdmSwPlugin.Common\\Entity\\Pdm\\PdmBom.cs",
-              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Common\\Entity\\Pdm\\PdmBom.cs",
-              "RelativeToolTip": "PdmSwPlugin.Common\\Entity\\Pdm\\PdmBom.cs",
-              "ViewState": "AgIAAIgAAAAAAAAAAAA+wJYAAAAdAAAAAAAAAA==",
-              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2024-10-31T08:32:38.632Z"
-            },
-            {
-              "$type": "Document",
-              "DocumentIndex": 6,
-              "Title": "MainWindow.xaml.cs",
-              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\Md5Reader\\MainWindow.xaml.cs",
-              "RelativeDocumentMoniker": "Md5Reader\\MainWindow.xaml.cs",
-              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\Md5Reader\\MainWindow.xaml.cs",
-              "RelativeToolTip": "Md5Reader\\MainWindow.xaml.cs",
-              "ViewState": "AgIAAAAAAAAAAAAAAAAAABAAAABDAAAAAAAAAA==",
-              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2024-10-30T02:39:22.183Z"
-            },
-            {
-              "$type": "Document",
-              "DocumentIndex": 7,
-              "Title": "MainControl.xaml.cs",
-              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\MainControl.xaml.cs",
-              "RelativeDocumentMoniker": "PdmSwPlugin.Main\\MainControl.xaml.cs",
-              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.Main\\MainControl.xaml.cs",
-              "RelativeToolTip": "PdmSwPlugin.Main\\MainControl.xaml.cs",
-              "ViewState": "AgIAAMAAAAAAAAAAAAAYwMoAAAAAAAAAAAAAAA==",
-              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2024-10-14T04:24:56.766Z"
-            },
-            {
-              "$type": "Document",
-              "DocumentIndex": 8,
-              "Title": "Listener.cs",
-              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\SolidWorksListener\\Listener.cs",
-              "RelativeDocumentMoniker": "SolidWorksListener\\Listener.cs",
-              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\SolidWorksListener\\Listener.cs",
-              "RelativeToolTip": "SolidWorksListener\\Listener.cs",
-              "ViewState": "AgIAANAAAAAAAAAAAADwv90AAAAiAAAAAAAAAA==",
-              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2024-10-14T03:42:50.289Z"
-            },
-            {
-              "$type": "Document",
-              "DocumentIndex": 9,
-              "Title": "AsyncAttacher.cs",
-              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\WpfUI\\AsyncAttacher.cs",
-              "RelativeDocumentMoniker": "WpfUI\\AsyncAttacher.cs",
-              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\WpfUI\\AsyncAttacher.cs",
-              "RelativeToolTip": "WpfUI\\AsyncAttacher.cs",
-              "ViewState": "AgIAAAAAAAAAAAAAAAAAAA8AAAAJAAAAAAAAAA==",
-              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2024-10-14T03:36:12.415Z"
-            },
-            {
-              "$type": "Document",
-              "DocumentIndex": 10,
-              "Title": "SwAddin.cs",
-              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSw\\SwAddin.cs",
-              "RelativeDocumentMoniker": "PdmSw\\SwAddin.cs",
-              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSw\\SwAddin.cs",
-              "RelativeToolTip": "PdmSw\\SwAddin.cs",
-              "ViewState": "AgIAABMBAAAAAAAAAAAkwCYBAAAkAAAAAAAAAA==",
-              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
-              "WhenOpened": "2024-10-14T01:09:55.509Z"
+              "Title": "JgjPartPanel.xaml",
+              "DocumentMoniker": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PropertySetting\\Panel\\JgjPartPanel.xaml",
+              "RelativeDocumentMoniker": "PdmSwPlugin.PropertySetting\\Panel\\JgjPartPanel.xaml",
+              "ToolTip": "D:\\Workspace\\PdmSwPlugin2\\PdmSwPlugin.PropertySetting\\Panel\\JgjPartPanel.xaml",
+              "RelativeToolTip": "PdmSwPlugin.PropertySetting\\Panel\\JgjPartPanel.xaml",
+              "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
+              "WhenOpened": "2025-01-02T06:07:52.955Z",
+              "EditorCaption": ""
             }
           ]
         }
diff --git a/InnoSetupScript/PdmSwPlugin.iss b/InnoSetupScript/PdmSwPlugin.iss
index b520d2d..23494a5 100644
--- a/InnoSetupScript/PdmSwPlugin.iss
+++ b/InnoSetupScript/PdmSwPlugin.iss
@@ -7,7 +7,7 @@
 ; 自动更新程序路径
 #define AutoUpdaterDir = "D:\Workspace\PdmSwPlugin2\PdmSw\bin\x64\Release\AutoUpdater\"
 ; 版本
-#define Version = "_0.0.0.43_改"
+#define Version = "_0.0.0.45_审核质量"
 
 ; 生成的Installer存放路径
 #define OutPutDir = "Z:\Output"
diff --git a/PdmSw/SwAddin.cs b/PdmSw/SwAddin.cs
index 937fea0..96adc0a 100644
--- a/PdmSw/SwAddin.cs
+++ b/PdmSw/SwAddin.cs
@@ -294,6 +294,7 @@
                 KeyPreview = true,
                 Dock = DockStyle.Fill
             };
+            mainForm.FormClosed += MainForm_FormClosed;
             mainForm.Controls.Add(host);
             IntPtr ptr = mainForm.Handle;
             // IntPtr ptr = WindowIntPtrUtil.FindWindow(null, "Window1");
@@ -301,6 +302,12 @@
             mainForm.WindowState = FormWindowState.Maximized;
         }
 
+        private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
+        {
+            /// 关闭时先执行DeActiveHandler,然后执行这个
+            
+        }
+
         private void LoadPlugins()
         {
             // 读图,估计是panel的图标
diff --git a/PdmSwPlugin.Common/BomIniter/NameUtil.cs b/PdmSwPlugin.Common/BomIniter/NameUtil.cs
index f3bb049..268e5be 100644
--- a/PdmSwPlugin.Common/BomIniter/NameUtil.cs
+++ b/PdmSwPlugin.Common/BomIniter/NameUtil.cs
@@ -1,5 +1,6 @@
 锘縰sing PdmSwPlugin.Common.Setting;
 using System;
+using System.Text.RegularExpressions;
 
 namespace PdmSwPlugin.Common
 {
diff --git a/PdmSwPlugin.Common/BomIniter/YwtBomIniter.cs b/PdmSwPlugin.Common/BomIniter/YwtBomIniter.cs
index 6b105f0..3b6379e 100644
--- a/PdmSwPlugin.Common/BomIniter/YwtBomIniter.cs
+++ b/PdmSwPlugin.Common/BomIniter/YwtBomIniter.cs
@@ -27,12 +27,14 @@
 
             string jgjNameRegx = CustomerSetting.Instance["jgjNameRegx"];
             string standardNameRegx = CustomerSetting.Instance["standardNameRegx"];
+            string specialJgjRegx = CustomerSetting.Instance["specialJgjRegx"];
 
             if (Regex.IsMatch(childName, jgjNameRegx))
             {
                 if (bom._drawInfo != null)
                 {
                     bom._drawInfo.HistoryData = NameUtil.IsHistoryDoc(childName);
+                    bom._drawInfo.isSpecial = Regex.IsMatch(childName, specialJgjRegx);
                 }
 
                 string docType = bom.properties.Get("鏂囦欢鏍煎紡");
diff --git a/PdmSwPlugin.Common/Control/RichHisWindow.xaml.cs b/PdmSwPlugin.Common/Control/RichHisWindow.xaml.cs
index ce3c459..877c658 100644
--- a/PdmSwPlugin.Common/Control/RichHisWindow.xaml.cs
+++ b/PdmSwPlugin.Common/Control/RichHisWindow.xaml.cs
@@ -55,7 +55,7 @@
             InitializeComponent();
             this.title = title;
             DataContext = this;
-            if (hisList == null)
+            if (hisList == null || hisList.Count <= 0)
             {
                 this.HisList = new ObservableCollection<DrawAuditHis>();
             }
diff --git a/PdmSwPlugin.Common/Entity/Pdm/PdmBom.cs b/PdmSwPlugin.Common/Entity/Pdm/PdmBom.cs
index 7cddf17..5145fec 100644
--- a/PdmSwPlugin.Common/Entity/Pdm/PdmBom.cs
+++ b/PdmSwPlugin.Common/Entity/Pdm/PdmBom.cs
@@ -85,6 +85,14 @@
             set => RaiseAndSetIfChanged(ref _status, value);
         }
 
+        private bool? _inKeeDeeDb;
+
+        public bool? inKeeDeeDb
+        {
+            get => _inKeeDeeDb;
+            set => RaiseAndSetIfChanged(ref _inKeeDeeDb, value);
+        }
+
         private string _auditId;
         public string auditId
         {
@@ -116,6 +124,26 @@
     /// </summary>
     public class DrawInfo : NotifyBase
     {
+        /// <summary>
+        /// true璇存槑娌℃湁宸ョ▼鍥�
+        /// </summary>
+        public bool _noDrw = false;
+
+        public bool noDrw
+        {
+            get => _noDrw;
+            set => RaiseAndSetIfChanged(ref _noDrw, value);
+        }
+
+        public bool _inKeeDeeDb = false;
+
+        private bool _isSpecial;
+        public bool isSpecial
+        {
+            get => _isSpecial;
+            set => RaiseAndSetIfChanged(ref _isSpecial, value);
+        }
+
         /// <summary>
         /// 3Dmd5
         /// </summary>
@@ -169,6 +197,10 @@
         public List<string> errMessages { get; set; }
 
         public Dictionary<string, string> allProperties { get; set; }
+
+        /// <summary>
+        /// 涓篢rue璇存槑娌℃湁宸ョ▼鍥�
+        /// </summary>
     }
 
     [Serializable]
@@ -197,6 +229,11 @@
             set => RaiseAndSetIfChanged(ref _treeId, value);
         }
 
+        /// <summary>
+        /// true璇存槑娌℃湁宸ョ▼鍥�
+        /// </summary>
+        public bool noDrw => (_drawInfo?.noDrw == true);
+
         public string id => BomInfo?.id;
         public string name => BomInfo?.name;
         public string partNo => BomInfo?.partNo;
@@ -222,10 +259,6 @@
         public string checkUserId => BomInfo?.checkUserId;
         public string checkUserName => BomInfo?.checkUserName;
 
-        #region 瑙勫垯妫�鏌ョ浉鍏冲瓧娈�
-
-        #endregion
-
         #region 鍥剧焊瀹℃牳鐩稿叧瀛楁
         public string drawStatus => BomInfo?.status;
         public string requestUserId => BomInfo?.requestUserId;
@@ -244,8 +277,15 @@
         /// <summary>
         /// 鍥剧焊鏄惁鍙戠敓鍙樻洿 闈炲巻鍙插浘绾哥湅2D鍥綧D5 鍘嗗彶鍥剧焊鐪嬩竴鑷存�ф鏌ユ病閫氳繃
         /// </summary>
-        public bool localDocChanged => (!IsHistoryData && localD2Md5 != _drawInfo?.d2Md5)
-            || (IsHistoryData && _drawInfo?.checkRuleResult == 2); //localD3Md5 != _drawInfo?.d3Md5;
+        public bool localDocChanged
+        {
+            get
+            {
+                //if (!IsHistoryData) return localD2Md5 != _drawInfo?.d2Md5; //(!IsHistoryData && localD2Md5 != _drawInfo?.d2Md5)
+                //return (IsHistoryData && _drawInfo?.checkRuleResult == 2);
+                return false;
+            }
+        }
         /// <summary>
         /// 瑙勫垯妫�鏌ョ粨鏋�
         /// </summary>
@@ -277,24 +317,29 @@
             {
                 // 鎵句笉鍒版枃妗g殑涓嶅鏍�
                 if (lost) return false;
-                // 涓嶅湪鐗╂枡鏄庣粏琛ㄤ腑涓嶅鏍�
-                if (ExcludeFromBOM) return false;
-                // 妯$粍涓嶅鏍�
-                if (produceWay == "妯$粍") return false;
+                // 璺宠繃妫�鏌ョ殑涓嶅
+                if (skipCheck) return false;
+                // 杩涘叆绯荤粺鐨勪笉瀹℃牳
+                if (BomInfo.inKeeDeeDb == true) return false;
+                //if (_drawInfo.isSpecial) return false;
                 // 寰呭鏍哥殑涓嶉噸澶嶆彁浜�
                 if (drawStatus == "submitted" || drawStatus == "resubmitted") return false;
-                if (IsHistoryData)
-                {
-                    // 鍘嗗彶鍥剧焊鍙鏍镐竴鑷存�т笉閫氳繃鐨� 鍜岃椹冲洖鐨�
-                    return _drawInfo.checkRuleResult == 2 || drawStatus == "rejected";
-                }
-                else
-                {
-                    // 闈炲巻鍙插浘绾稿彧瀹℃牳 鍏佽瀹℃牳鐨勫姞宸ヤ欢
-                    return produceWay == "鍔犲伐浠�"
-                            && (drawStatus != "submitted" && drawStatus != "resubmitted")
-                            && (drawStatus != "completed" || localDocChanged);
-                }
+                return produceWay == "鍔犲伐浠�" && (drawStatus != "submitted" && drawStatus != "resubmitted")
+                            && (drawStatus != "completed");
+
+                /// 浠ュ墠杩樿鍒嗗浘绾稿彉鏇达紝鐜板湪涓嶅紕浜�
+                //if (IsHistoryData)
+                //{
+                //    // 鍘嗗彶鍥剧焊鍙鏍镐竴鑷存�т笉閫氳繃鐨� 鍜岃椹冲洖鐨�
+                //    return _drawInfo.checkRuleResult == 2 || drawStatus == "rejected";
+                //}
+                //else
+                //{
+                //    // 闈炲巻鍙插浘绾稿彧瀹℃牳 鍏佽瀹℃牳鐨勫姞宸ヤ欢
+                //    return produceWay == "鍔犲伐浠�"
+                //            && (drawStatus != "submitted" && drawStatus != "resubmitted")
+                //            && (drawStatus != "completed" || localDocChanged);
+                //}
             }
         }
 
@@ -304,18 +349,18 @@
         /// <returns></returns>
         public string NeedStopCheckIn()
         {
-            if (produceWay == "妯$粍") return null;
-            if (ExcludeFromBOM) return null;
+            if (skipCheck) return null;
+            if (BomInfo.inKeeDeeDb == true) return null;
             if (IsHistoryData)
             {
                 bool err = false;
                 string msg = $"鍘嗗彶鍥剧焊銆恵partModel}銆�";
-                if (localDocChanged)
+                if (localDocChanged && !noDrw)
                 {
                     err = true;
                     msg += "鍙樻洿鍚庢湭閲嶆柊瀹℃牳;";
                 }
-                else if (drawStatus == "rejected" || drawStatus == "submitted" || drawStatus == "resubmitted")
+                if ((drawStatus == "rejected" || drawStatus == "submitted" || drawStatus == "resubmitted") && BomInfo.inKeeDeeDb != true)
                 {
                     err = true;
                     msg += "鏈�氳繃瀹℃牳";
@@ -325,6 +370,11 @@
                 {
                     err = true;
                     msg += "琚殣钘�;";
+                }
+                if (noDrw)
+                {
+                    err = true;
+                    msg += "鏈壘鍒板伐绋嬪浘";
                 }
                 return err ? msg : null;
             }
@@ -342,16 +392,21 @@
                     error = true;
                     msg += "琚殣钘�;";
                 }
-                if (produceWay == "鍔犲伐浠�" && drawStatus != "completed")
+                if (produceWay == "鍔犲伐浠�" && drawStatus != "completed" && BomInfo.inKeeDeeDb != true)
                 {
                     error = true;
                     msg += "鏈�氳繃瀹℃牳;";
                 }
-                if (produceWay == "鍔犲伐浠�" && drawStatus == "completed" && localDocChanged)
+                if (produceWay == "鍔犲伐浠�" && drawStatus == "completed" && localDocChanged && !noDrw)
                 {
                     error = true;
                     msg += "鍥剧焊鍙樻洿鍚庢湭閲嶆柊瀹℃牳";
                 }
+                if (noDrw)
+                {
+                    error = true;
+                    msg += "鏈壘鍒板伐绋嬪浘";
+                }
                 return error ? msg : null;
             }
             return null;
diff --git a/PdmSwPlugin.Common/Util/CustomPropertyUtil.cs b/PdmSwPlugin.Common/Util/CustomPropertyUtil.cs
index 136ad88..79b7a5a 100644
--- a/PdmSwPlugin.Common/Util/CustomPropertyUtil.cs
+++ b/PdmSwPlugin.Common/Util/CustomPropertyUtil.cs
@@ -212,8 +212,9 @@
         /// </summary>
         /// <param name="doc"></param>
         /// <returns></returns>
-        public static bool ClearAllCustomProperties(ModelDoc2 doc)
+        public static bool ClearAllCustomProperties(ModelDoc2 doc, out bool needSave)
         {
+            needSave = false;
             if (doc == null) return false;
             Configuration activeConfig = doc.GetActiveConfiguration() as Configuration;
             if (activeConfig == null)
@@ -230,8 +231,8 @@
             }
             foreach (var name in names)
             {
-
                 cpm.Delete2(name);
+                needSave = true;
             }
             return true;
         }
diff --git a/PdmSwPlugin.Common/Util/OpenDocContext.cs b/PdmSwPlugin.Common/Util/OpenDocContext.cs
index 217199d..872cc0a 100644
--- a/PdmSwPlugin.Common/Util/OpenDocContext.cs
+++ b/PdmSwPlugin.Common/Util/OpenDocContext.cs
@@ -5,18 +5,20 @@
 {
     public class OpenDocContext
     {
-        public static readonly Hashtable OpenDocs = new Hashtable();
+        public static readonly Hashtable OpenDocs = Hashtable.Synchronized(new Hashtable());
 
-        public static void AddDoc(ModelDoc2 doc, object handler) { 
+        public static void AddDoc(ModelDoc2 doc, object handler)
+        {
             OpenDocs.Add(doc, handler);
         }
 
-        public static bool IsOpenDoc(ModelDoc2 doc) { 
+        public static bool IsOpenDoc(ModelDoc2 doc)
+        {
             return OpenDocs.ContainsKey(doc);
         }
 
         public static void RemoveDoc(ModelDoc2 doc)
-        { 
+        {
             OpenDocs.Remove(doc);
         }
 
diff --git a/PdmSwPlugin.Common/Util/Pdm/BomTreeReader.cs b/PdmSwPlugin.Common/Util/Pdm/BomTreeReader.cs
index f8bba5f..d0d5981 100644
--- a/PdmSwPlugin.Common/Util/Pdm/BomTreeReader.cs
+++ b/PdmSwPlugin.Common/Util/Pdm/BomTreeReader.cs
@@ -41,6 +41,8 @@
 
         private int bomOrder = 0;
 
+        public ConcurrentQueue<string> needSaveList { get; set; } = new ConcurrentQueue<string>();
+
         /// <summary>
         /// 澶氱嚎绋嬩粠鎵撳紑鐨勬牴鏂囨。涓鍙朆OM淇℃伅
         /// </summary>
@@ -59,10 +61,22 @@
             {
                 return;
             }
-            CustomPropertyUtil.ClearAllCustomProperties(sldDoc);
-
             Component2 rootComponent = activeConfiguration.GetRootComponent3(false);
             string path = rootComponent.GetPathName();
+
+            CustomPropertyUtil.ClearAllCustomProperties(sldDoc, out bool needSave);
+            if (needSave)
+            {
+                int err = 0, warn = 0;
+                if (sldDoc.Save3((int)swSaveAsOptions_e.swSaveAsOptions_AvoidRebuildOnSave, ref err, ref warn))
+                {
+                    needSaveList.Enqueue(path);
+                }
+                else
+                {
+                    needSaveList.Enqueue($"{path}鑷姩淇濆瓨澶辫触锛屽紓甯镐唬鐮�:{err}");
+                }
+            }
 
             BomInfo bomInfo = GetBomInfoFromDoc(rootComponent);
             PdmBom bom = ConcatCacheBom(bomInfo, 0, null, rootComponent);
@@ -123,9 +137,22 @@
                 {
                     Component2 childComponent = child as Component2;
                     ModelDoc2 childDoc = childComponent.GetModelDoc2();
-                    // 娓呮鏍煎紡涓嶅鐨勫睘鎬�
-                    CustomPropertyUtil.ClearAllCustomProperties(childDoc);
                     string childPath = childComponent.GetPathName();
+                    // 娓呴櫎鏍煎紡涓嶅鐨勫睘鎬�
+                    CustomPropertyUtil.ClearAllCustomProperties(childDoc, out bool needSave);
+                    if (needSave)
+                    {
+                        int err = 0, warn = 0;
+                        if (childDoc.Save3((int)swSaveAsOptions_e.swSaveAsOptions_AvoidRebuildOnSave, ref err, ref warn))
+                        {
+                            needSaveList.Enqueue(childPath);
+                        }
+                        else
+                        {
+                            needSaveList.Enqueue($"{childPath}鑷姩淇濆瓨澶辫触锛屽紓甯镐唬鐮�:{err}");
+                        }
+                    }
+
                     PdmBom bom = null;
                     if (BomInfoCache.ContainsKey(childPath))
                     {
@@ -203,6 +230,7 @@
             CacheList = new ConcurrentQueue<PdmBom>();
             TreeList = new ConcurrentQueue<PdmBom>();
             BomInfoCache = new ConcurrentDictionary<string, BomInfo>();
+            needSaveList = new ConcurrentQueue<string>();
             GetBomsFromDocAsync(doc);
             return TreeList.OrderBy(e => e.name).ToList(); ;
         }
@@ -216,7 +244,7 @@
             ModelDoc2 doc = component.GetModelDoc2();
             // 鐩存帴鐢ㄦ枃浠跺悕锛屼互鍏� SolidWorks 鍥犱负鏈夊涓浉鍚屾枃浠惰�屾妸 Name2 鍔犱簡 -N 鐨勫悗缂�鍚�
             string childPath = component.GetPathName();
-            string childName = Path.GetFileNameWithoutExtension(childPath);
+            string childName = System.IO.Path.GetFileNameWithoutExtension(childPath);
 
             if (ModelUtil.Is_Mn(childName))
             {
diff --git a/PdmSwPlugin.Common/Util/UI/MultiExWindow.xaml.cs b/PdmSwPlugin.Common/Util/UI/MultiExWindow.xaml.cs
index 5083893..0baccba 100644
--- a/PdmSwPlugin.Common/Util/UI/MultiExWindow.xaml.cs
+++ b/PdmSwPlugin.Common/Util/UI/MultiExWindow.xaml.cs
@@ -38,6 +38,13 @@
             set => RaiseAndSetIfChanged(ref _title, value);
         }
 
+        private string _header;
+        public string header
+        {
+            get => _header;
+            set => RaiseAndSetIfChanged(ref _header, value);
+        }
+
         private ObservableCollection<string> _exceptions;
 
         public ObservableCollection<string> exceptions
@@ -47,11 +54,13 @@
         }
 
 
-        public MultiExWindow(DependencyObject parent, string title, List<string> exceptions)
+        public MultiExWindow(DependencyObject parent, string title, List<string> exceptions,string header = "寮傚父淇℃伅")
         {
             this.title = title;
+            this.header = header;
             InitializeComponent();
             DataContext = this;
+            table.Columns[0].Header = header;
             if (exceptions == null)
             {
                 this.exceptions = new ObservableCollection<string>();
diff --git a/PdmSwPlugin.DrawApprove/DrawApprove.xaml.cs b/PdmSwPlugin.DrawApprove/DrawApprove.xaml.cs
index 32b593d..464f6fa 100644
--- a/PdmSwPlugin.DrawApprove/DrawApprove.xaml.cs
+++ b/PdmSwPlugin.DrawApprove/DrawApprove.xaml.cs
@@ -385,17 +385,28 @@
                             this.Error($"鏈嶅姟鍣ㄤ腑鏈壘鍒板浘绾告枃浠讹紝璺緞:{filePath}");
                             return;
                         }
-
-                        double[] massData = SwDMUtil.GetMassProperty(filePath, out string errMsg);
-                        if (massData == null)
+                        try
                         {
-                            this.Error($"鑾峰彇鍥剧焊涓�鑷存�ф暟鎹け璐ワ紒{errMsg}");
-                            return;
+                            double[] massData = SwDMUtil.GetMassProperty(filePath, out string errMsg);
+                            if (massData == null)
+                            {
+                                //this.Error($"鑾峰彇鍥剧焊涓�鑷存�ф暟鎹け璐ワ紒{errMsg}");
+                                //return;
+                                throw new Exception(errMsg);
+                            }
+                            da.fileName = Path.GetFileName(filePath);
+                            da.volume = NumberUtil.HandleMass(massData[3]);
+                            da.surfaceArea = NumberUtil.HandleMass(massData[4]);
+                            da.mass = NumberUtil.HandleMass(massData[5]);
                         }
-                        da.fileName = Path.GetFileName(filePath);
-                        da.volume = NumberUtil.HandleMass(massData[3]);
-                        da.surfaceArea = NumberUtil.HandleMass(massData[4]);
-                        da.mass = NumberUtil.HandleMass(massData[5]);
+                        catch (Exception ex)
+                        {
+                            Logger.Warn("Get Doc Mass Data Failed.", ex);
+                            da.fileName = Path.GetFileName(filePath);
+                            da.volume = 0;
+                            da.surfaceArea = 0;
+                            da.mass = 0;
+                        }
                         da.pass = true;
                         Result<object> res = Client.PostSyncAction<object>(da, "drawAudit/complete");
                         object obj = res.HandleResult();
@@ -533,6 +544,8 @@
 
         public void OnSwActiveDocChange(ModelDoc2 oldDoc, ModelDoc2 newDoc, Component2 comp)
         {
+            long start = DateTime.Now.Millisecond;
+            Logger.Debug("Find Open Doc Start...");
             string path = newDoc.GetPathName();
             Uri fileName;
             if (string.IsNullOrEmpty(path))
@@ -549,6 +562,7 @@
                 var d3Path = new Uri(GetRealFilePath(e.d3RelativePath));
                 e.IsOpening = fileName == d2Path || fileName == d3Path;
             }
+            Logger.Debug($"Find Open Doc {path} End {DateTime.Now.Millisecond - start}ms.");
         }
 
         public void OnSwActiveDocSaved(ModelDoc2 doc, Component2 comp)
diff --git a/PdmSwPlugin.Main/Constant/PluginConst.cs b/PdmSwPlugin.Main/Constant/PluginConst.cs
index 522d835..dbef9ca 100644
--- a/PdmSwPlugin.Main/Constant/PluginConst.cs
+++ b/PdmSwPlugin.Main/Constant/PluginConst.cs
@@ -3,6 +3,6 @@
     public class PluginConst
     {
         public static readonly string AppId = "DF23E96F-A469-4302-8367-7FA2F798CD09";
-        public static readonly string Version = "0.0.0.44";
+        public static readonly string Version = "0.0.0.45";
     }
 }
diff --git a/PdmSwPlugin.Main/EventHandler/BaseAttacher.cs b/PdmSwPlugin.Main/EventHandler/BaseAttacher.cs
index 39d3dcb..70ce1ae 100644
--- a/PdmSwPlugin.Main/EventHandler/BaseAttacher.cs
+++ b/PdmSwPlugin.Main/EventHandler/BaseAttacher.cs
@@ -4,10 +4,14 @@
 using SolidWorks.Interop.swconst;
 using System;
 using System.Collections;
+using System.Threading.Tasks;
 using System.Windows.Controls;
 
 namespace PdmSwPlugin.Main.EventHandler
 {
+    /// <summary>
+    /// 浜嬩欢闄勫姞鍣�
+    /// </summary>
     public class BaseAttacher : IEventAttacher, IDocEventHandler
     {
         public static ILog Logger { get; } = LogManager.GetLogger("SwAddin");
@@ -33,8 +37,9 @@
         /// <returns></returns>
         public virtual bool AttachEventHandlers()
         {
+            // 娣诲姞搴旂敤浜嬩欢鐩戝惉
             AttachSwEvents();
-            //Listen for events on all currently open docs
+            // 娣诲姞鏂囨。浜嬩欢鐩戝惉
             AttachEventsToAllDocuments();
             return true;
         }
@@ -60,14 +65,55 @@
 
         private bool AttachEventsToAllDocuments()
         {
-            ModelDoc2 modDoc = (ModelDoc2)SwApp.GetFirstDocument();
-            while (modDoc != null)
+            //ModelDoc2 modDoc = (ModelDoc2)SwApp.GetFirstDocument();
+            //while (modDoc != null)
+            //{
+            //    if (!OpenDocContext.IsOpenDoc(modDoc))
+            //    {
+            //        AttachModelDocEventHandler(modDoc);
+            //    }
+            //    modDoc = (ModelDoc2)modDoc.GetNext();
+            //}
+
+            /// 璇曚竴涓嬪紓姝ラ檮鍔犱簨浠�
+            var objs = SwApp.GetDocuments();
+            if (objs != null && objs.Length > 0)
             {
-                if (!OpenDocContext.IsOpenDoc(modDoc))
+                Task[] tasks = new Task[objs.Length];
+                for (int i = 0; i < objs.Length; i++)
                 {
-                    AttachModelDocEventHandler(modDoc);
+                    var obj = objs[i];
+                    if (obj is ModelDoc2 modDoc)
+                    {
+                        tasks[i] = Task.Run(() =>
+                        {
+                            if (!OpenDocContext.IsOpenDoc(modDoc))
+                            {
+                                AttachModelDocEventHandler(modDoc);
+                            }
+                        });
+                    }
                 }
-                modDoc = (ModelDoc2)modDoc.GetNext();
+                Task.WaitAll(tasks);
+            }
+            return true;
+        }
+
+        private bool AttachEventsToAllDocuments(ModelDoc2 modDoc)
+        {
+            if (!OpenDocContext.IsOpenDoc(modDoc))
+            {
+                AttachModelDocEventHandler(modDoc);
+            }
+            return true;
+        }
+
+        private bool AttachEventsToAllDocuments(string fileName)
+        {
+            ModelDoc2 modDoc = SwApp.GetOpenDocument(fileName);
+            if (!OpenDocContext.IsOpenDoc(modDoc))
+            {
+                AttachModelDocEventHandler(modDoc);
             }
             return true;
         }
@@ -208,7 +254,7 @@
 
         public int OnFileNew(object newDoc, int docType, string templateName)
         {
-            AttachEventsToAllDocuments();
+            AttachEventsToAllDocuments((ModelDoc2)newDoc);
             return 0;
         }
 
@@ -217,7 +263,13 @@
             return 0;
         }
 
-        public int FileOpenPostNotify(string FileName)
+        /// <summary>
+        /// Post-notifies an application when a file has been opened.
+        /// 鍦ㄦ墦寮�鏂囦欢鏃� Post-閫氱煡搴旂敤绋嬪簭銆�
+        /// </summary>
+        /// <param name="FileName"></param>
+        /// <returns></returns>
+        public int FileOpenPostNotify(string filePath)
         {
             AttachEventsToAllDocuments();
             return 0;
diff --git a/PdmSwPlugin.Main/SwAddIn/MainControl.cs b/PdmSwPlugin.Main/SwAddIn/MainControl.cs
index 6b1208c..56b44f7 100644
--- a/PdmSwPlugin.Main/SwAddIn/MainControl.cs
+++ b/PdmSwPlugin.Main/SwAddIn/MainControl.cs
@@ -365,19 +365,29 @@
 
         public void DeActiveHandler()
         {
-            foreach (TabItem item in mainTab.tabControl.Items)
+            try
             {
-                // 鍚戜富Control娉ㄥ唽浜嬩欢
-                if (item.Content is IActiveDocChangeHandler handler)
+                if (mainTab?.tabControl != null)
                 {
-                    ActiveDocChangeEvent -= handler.OnSwActiveDocChange;
-                    ActiveDocSavedEvent -= handler.OnSwActiveDocSaved;
-                    ActiveDocCustomPropertyChange -= handler.OnCustomPropertyChange;
-                    DocDestroy -= handler.OnDocDestroy;
-                    AfterDocDestroy -= handler.AfterDocDestroy;
+                    foreach (TabItem item in mainTab.tabControl.Items)
+                    {
+                        // 鍚戜富Control娉ㄥ唽浜嬩欢
+                        if (item.Content is IActiveDocChangeHandler handler)
+                        {
+                            ActiveDocChangeEvent -= handler.OnSwActiveDocChange;
+                            ActiveDocSavedEvent -= handler.OnSwActiveDocSaved;
+                            ActiveDocCustomPropertyChange -= handler.OnCustomPropertyChange;
+                            DocDestroy -= handler.OnDocDestroy;
+                            AfterDocDestroy -= handler.AfterDocDestroy;
+                        }
+                    }
+                    PluginInfos.Clear();
                 }
             }
-            PluginInfos.Clear();
+            catch (Exception ex)
+            {
+                Logger.Error("DeActiveHandler Failed.", ex);
+            }
         }
 
         /// <summary>
diff --git a/PdmSwPlugin.PDM/Model/PdmControlModel.cs b/PdmSwPlugin.PDM/Model/PdmControlModel.cs
index 7a71c9c..648c70a 100644
--- a/PdmSwPlugin.PDM/Model/PdmControlModel.cs
+++ b/PdmSwPlugin.PDM/Model/PdmControlModel.cs
@@ -44,7 +44,8 @@
         public ObservableCollection<PdmBom> BomTree
         {
             get => _bomTree;
-            set {
+            set
+            {
                 RaiseAndSetIfChanged(ref _bomTree, value);
                 int count = CacheList != null ? CacheList.Count : 0;
                 AllBomCount = $"鍏� {count} 鏉�";
@@ -52,8 +53,9 @@
             }
         }
 
-        public void RefreshSelectedBomCount() {
-            int count = CacheList != null ? CacheList.Where(e=>e.selected).Count() : 0;
+        public void RefreshSelectedBomCount()
+        {
+            int count = CacheList != null ? CacheList.Where(e => e.selected).Count() : 0;
             SelectedBomCount = $"宸查�変腑 {count} 鏉�";
         }
 
@@ -93,7 +95,7 @@
         private Dictionary<string, BomInfo> GetBomsFromWeb(HttpClient Client, PdmBomParam param)
         {
             Result<Dictionary<string, BomInfo>> result =
-                    Client.PostSyncAction<Dictionary<string, BomInfo>>(param, "wpf/bom/openApi/bomInfo2");
+                    Client.PostSyncAction<Dictionary<string, BomInfo>>(param, "wpf/bom/openApi/bomInfo3");
             Dictionary<string, BomInfo> bomInfo = result.HandleResult();
             return bomInfo;
         }
@@ -113,7 +115,7 @@
                 allModels = models
             };
             Result<Dictionary<string, BomInfo>> result =
-                    Client.PostSyncAction<Dictionary<string, BomInfo>>(param, "wpf/bom/openApi/bomInfo2");
+                    Client.PostSyncAction<Dictionary<string, BomInfo>>(param, "wpf/bom/openApi/bomInfo3");
             Dictionary<string, BomInfo> bomInfos = result.HandleResult();
             Dictionary<string, DrawInfo> drawInfos = new Dictionary<string, DrawInfo>();
             FillBomInfo(BomTree.ToList(), bomInfos, drawInfos);
@@ -143,19 +145,22 @@
                 {
                     info = bomInfos[partModel];
                     bom.inDb = true;
-                    //bom.BomInfo = info;
-                    bom.BomInfo.id = info.id;
-                    bom.BomInfo.bomVersion = info.bomVersion;
-                    bom.BomInfo.checkStatus = info.checkStatus;
-                    bom.BomInfo.checkUserId = info.checkUserId;
-                    bom.BomInfo.checkUserName = info.checkUserName;
+                    if (!string.IsNullOrEmpty(info.id))
+                    {
+                        //bom.BomInfo = info;
+                        bom.BomInfo.id = info.id;
+                        bom.BomInfo.bomVersion = info.bomVersion;
+                        bom.BomInfo.checkStatus = info.checkStatus;
+                        bom.BomInfo.checkUserId = info.checkUserId;
+                        bom.BomInfo.checkUserName = info.checkUserName;
 
-                    bom.BomInfo.status = info.status;
-                    bom.BomInfo.requestUserId = info.requestUserId;
-                    bom.BomInfo.requestUser = info.requestUser;
-                    bom.BomInfo.auditUserId = info.auditUserId;
-                    bom.BomInfo.auditUser = info.auditUser;
-
+                        bom.BomInfo.status = info.status;
+                        bom.BomInfo.requestUserId = info.requestUserId;
+                        bom.BomInfo.requestUser = info.requestUser;
+                        bom.BomInfo.auditUserId = info.auditUserId;
+                        bom.BomInfo.auditUser = info.auditUser;
+                    }
+                    bom.BomInfo.inKeeDeeDb = info.inKeeDeeDb;
                 }
                 else
                 {
diff --git a/PdmSwPlugin.PDM/PdmControl.xaml b/PdmSwPlugin.PDM/PdmControl.xaml
index 0870c68..5e8492e 100644
--- a/PdmSwPlugin.PDM/PdmControl.xaml
+++ b/PdmSwPlugin.PDM/PdmControl.xaml
@@ -117,6 +117,47 @@
                         <Setter Property="Foreground" Value="White"/>
                         <Setter Property="Background" Value="Gray"/>
                     </DataTrigger>
+
+                    <DataTrigger Binding="{Binding drawInfo.noDrw}" Value="true">
+                        <Setter Property="Text" Value="鏈�氳繃"/>
+                        <Setter Property="Foreground" Value="White"/>
+                        <Setter Property="Background" Value="Red"/>
+                    </DataTrigger>
+
+                    <DataTrigger Binding="{Binding skipCheck}" Value="true">
+                        <Setter Property="Text" Value="鏃犻渶妫�鏌�"/>
+                        <Setter Property="Foreground" Value="White"/>
+                        <Setter Property="Background" Value="Gray"/>
+                    </DataTrigger>
+
+                    <!--<MultiDataTrigger>
+                        <MultiDataTrigger.Conditions>
+                            <Condition Binding="{Binding IsHistoryData}" Value="true"/>
+                            <Condition Binding="{Binding drawInfo.noDrw}" Value="false"/>
+                        </MultiDataTrigger.Conditions>
+                        <Setter Property="Text" Value="鏃犻渶妫�鏌�"/>
+                        <Setter Property="Foreground" Value="White"/>
+                        <Setter Property="Background" Value="Gray"/>
+                    </MultiDataTrigger>
+
+                    <MultiDataTrigger>
+                        <MultiDataTrigger.Conditions>
+                            <Condition Binding="{Binding IsHistoryData}" Value="true"/>
+                            <Condition Binding="{Binding drawInfo.noDrw}" Value="true"/>
+                        </MultiDataTrigger.Conditions>
+                        <Setter Property="Text" Value="鏈�氳繃"/>
+                        <Setter Property="Foreground" Value="White"/>
+                        <Setter Property="Background" Value="Red"/>
+                    </MultiDataTrigger>-->
+                    <MultiDataTrigger>
+                        <MultiDataTrigger.Conditions>
+                            <Condition Binding="{Binding BomInfo.inKeeDeeDb}" Value="true"/>
+                            <Condition Binding="{Binding drawInfo.noDrw}" Value="false"/>
+                        </MultiDataTrigger.Conditions>
+                        <Setter Property="Text" Value="宸插叆绯荤粺"/>
+                        <Setter Property="Foreground" Value="White"/>
+                        <Setter Property="Background" Value="DarkGreen"/>
+                    </MultiDataTrigger>
                 </Style.Triggers>
             </Style>
 
@@ -125,7 +166,7 @@
                 <Setter Property="Foreground" Value="Black"/>
                 <Setter Property="Background" Value="White"/>
                 <Style.Triggers>
-                    <DataTrigger Binding="{Binding produceWay}" Value="妯$粍">
+                    <DataTrigger Binding="{Binding skipCheck}" Value="true">
                         <Setter Property="Text" Value="鏃犻渶瀹℃牳"/>
                         <Setter Property="Foreground" Value="White"/>
                         <Setter Property="Background" Value="Gray"/>
@@ -137,7 +178,13 @@
                         <Setter Property="Background" Value="Gray"/>
                     </DataTrigger>
 
-                    <MultiDataTrigger>
+                    <DataTrigger Binding="{Binding drawInfo.isSpecial}" Value="True">
+                        <Setter Property="Text" Value="鏃犻渶瀹℃牳"/>
+                        <Setter Property="Foreground" Value="White"/>
+                        <Setter Property="Background" Value="Gray"/>
+                    </DataTrigger>
+
+                    <!--<MultiDataTrigger>
                         <MultiDataTrigger.Conditions>
                             <Condition Binding="{Binding drawInfo.HistoryData}" Value="true"/>
                             <Condition Binding="{Binding localDocChanged}" Value="false"/>
@@ -145,16 +192,41 @@
                         <Setter Property="Text" Value="鏃犻渶瀹℃牳"/>
                         <Setter Property="Foreground" Value="White"/>
                         <Setter Property="Background" Value="Gray"/>
-                    </MultiDataTrigger>
+                    </MultiDataTrigger>-->
 
                     <MultiDataTrigger>
                         <MultiDataTrigger.Conditions>
                             <Condition Binding="{Binding drawInfo.HistoryData}" Value="true"/>
                             <Condition Binding="{Binding localDocChanged}" Value="true"/>
+                            <Condition Binding="{Binding drawInfo.noDrw}" Value="false"/>
+                            <Condition Binding="{Binding skipCheck}" Value="false"/>
                         </MultiDataTrigger.Conditions>
                         <Setter Property="Text" Value="鍘嗗彶鍥剧焊鍙樻洿"/>
                         <Setter Property="Foreground" Value="White"/>
                         <Setter Property="Background" Value="Blue"/>
+                    </MultiDataTrigger>
+
+
+                    <MultiDataTrigger>
+                        <MultiDataTrigger.Conditions>
+                            <Condition Binding="{Binding BomInfo.status}" Value="completed"/>
+                            <Condition Binding="{Binding localDocChanged}" Value="true"/>
+                            <Condition Binding="{Binding drawInfo.noDrw}" Value="false"/>
+                            <Condition Binding="{Binding skipCheck}" Value="false"/>
+                        </MultiDataTrigger.Conditions>
+                        <Setter Property="Text" Value="鏂囨。鍙樻洿"/>
+                        <Setter Property="Foreground" Value="White"/>
+                        <Setter Property="Background" Value="Blue"/>
+                    </MultiDataTrigger>
+
+                    <MultiDataTrigger>
+                        <MultiDataTrigger.Conditions>
+                            <Condition Binding="{Binding skipCheck}" Value="false"/>
+                            <Condition Binding="{Binding drawInfo.noDrw}" Value="true"/>
+                        </MultiDataTrigger.Conditions>
+                        <Setter Property="Text" Value="鏈壘鍒板伐绋嬪浘"/>
+                        <Setter Property="Foreground" Value="White"/>
+                        <Setter Property="Background" Value="Red"/>
                     </MultiDataTrigger>
 
                     <MultiDataTrigger>
@@ -165,16 +237,6 @@
                         <Setter Property="Text" Value="宸查�氳繃"/>
                         <Setter Property="Foreground" Value="White"/>
                         <Setter Property="Background" Value="Green"/>
-                    </MultiDataTrigger>
-
-                    <MultiDataTrigger>
-                        <MultiDataTrigger.Conditions>
-                            <Condition Binding="{Binding BomInfo.status}" Value="completed"/>
-                            <Condition Binding="{Binding localDocChanged}" Value="true"/>
-                        </MultiDataTrigger.Conditions>
-                        <Setter Property="Text" Value="鏂囨。鍙樻洿"/>
-                        <Setter Property="Foreground" Value="White"/>
-                        <Setter Property="Background" Value="Blue"/>
                     </MultiDataTrigger>
 
                     <DataTrigger Binding="{Binding BomInfo.status}" Value="submitted">
@@ -192,6 +254,16 @@
                         <Setter Property="Foreground" Value="White"/>
                         <Setter Property="Background" Value="Red"/>
                     </DataTrigger>
+
+                    <MultiDataTrigger>
+                        <MultiDataTrigger.Conditions>
+                            <Condition Binding="{Binding BomInfo.inKeeDeeDb}" Value="true"/>
+                            <Condition Binding="{Binding drawInfo.noDrw}" Value="false"/>
+                        </MultiDataTrigger.Conditions>
+                        <Setter Property="Text" Value="宸插叆绯荤粺"/>
+                        <Setter Property="Foreground" Value="White"/>
+                        <Setter Property="Background" Value="DarkGreen"/>
+                    </MultiDataTrigger>
                 </Style.Triggers>
             </Style>
 
diff --git a/PdmSwPlugin.PDM/PdmControl.xaml.cs b/PdmSwPlugin.PDM/PdmControl.xaml.cs
index 6e6148a..e7667fb 100644
--- a/PdmSwPlugin.PDM/PdmControl.xaml.cs
+++ b/PdmSwPlugin.PDM/PdmControl.xaml.cs
@@ -1,45 +1,40 @@
-锘縰sing PdmSwPlugin.Common.Interface;
-using SolidWorks.Interop.sldworks;
-using System.Collections.Generic;
-using System.Linq;
-using System.Windows.Controls;
-using PdmSwPlugin.Common;
-using System.Collections.ObjectModel;
-using System.Net.Http;
-using System.Threading.Tasks;
-using System.Windows;
-using System;
-using NPOI.SS.UserModel;
-using NPOI.XSSF.UserModel;
-using System.IO;
+锘縰sing log4net;
 using Microsoft.Win32;
+using NPOI.SS.UserModel;
 using NPOI.Util;
+using NPOI.XSSF.UserModel;
+using PdmSwPlugin.Commmon.Control;
+using PdmSwPlugin.Commmon.Util.UI;
+using PdmSwPlugin.Common;
 using PdmSwPlugin.Common.Constants;
-using System.Threading;
-using log4net;
+using PdmSwPlugin.Common.Control.TreeGrid;
+using PdmSwPlugin.Common.Entity.DrawAudit;
+using PdmSwPlugin.Common.Entity.Pdm;
+using PdmSwPlugin.Common.Entity.System;
+using PdmSwPlugin.Common.Interface;
+using PdmSwPlugin.Common.Setting;
 using PdmSwPlugin.Common.Util;
 using PdmSwPlugin.Common.Util.Http;
-using PdmSwPlugin.Commmon.Util.UI;
-using PdmSwPlugin.Common.Entity.Pdm;
-using PdmSwPlugin.Common.Control.TreeGrid;
-using System.Windows.Data;
-using SolidWorks.Interop.swconst;
-using PdmSwPlugin.Common.Entity.DrawAudit;
-using System.Collections.Concurrent;
 using PdmSwPlugin.Common.Util.UI;
-using PdmSwPlugin.Common.Setting;
-using PdmSwPlugin.PDM.Model;
-using System.Diagnostics;
 using PdmSwPlugin.PDM.Constant;
-using static PdmSwPlugin.PDM.Event.PdmEvent;
+using PdmSwPlugin.PDM.Model;
+using SolidWorks.Interop.sldworks;
+using SolidWorks.Interop.swconst;
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Net.Http;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
 using System.Windows.Interop;
-using PdmSwPlugin.Commmon.Control;
-using PdmSwPlugin.Common.Entity.System;
-using System.Windows.Documents;
-using System.Windows.Input;
-using NPOI.POIFS.Properties;
-using NPOI.POIFS.Crypt;
-using System.Threading.Tasks.Schedulers;
+using static PdmSwPlugin.PDM.Event.PdmEvent;
 
 namespace PdmSwPlugin.PDM
 {
@@ -169,6 +164,15 @@
             }
         }
 
+        public void AutoSaveAlert(List<string> msgs)
+        {
+            //Dispatcher.Invoke(() =>
+            //{
+            //    MultiExWindow exWin = new MultiExWindow(this, "浠ヤ笅鏂囨。鍥犲垹闄ょ壒瀹氶厤缃�岃淇濆瓨", msgs, "鏂囦欢璺緞");
+            //    ShowExWindow(exWin);
+            //});
+        }
+
         /// <summary>
         /// 鍒锋柊鎸夐挳
         /// </summary>
@@ -187,6 +191,11 @@
                 await Task.Run(() =>
                 {
                     RefreshBomList(SwApp.IActiveDoc2);
+                    if (model.bomTreeReader.needSaveList.Count > 0)
+                    {
+                        List<string> msgs = new List<string>(model.bomTreeReader.needSaveList);
+                        AutoSaveAlert(msgs);
+                    }
                 });
                 Logger.Debug("PDM鎻掍欢锛屽垪琛ㄥ埛鏂板畬鎴愶紒");
             }
@@ -1004,8 +1013,13 @@
             allProperties["鍘嗗彶鍥剧焊"] = drawInfo.HistoryData.ToString();
             string drawFilePath = filepath.Replace(Path.GetExtension(filepath), ".slddrw");
             bool drawExists = File.Exists(drawFilePath);
-            // 宸ョ▼鍥句竴鑷存�ф鏌�
+            // 宸ョ▼鍥句竴鑷存�ф鏌� 
             allProperties["宸ョ▼鍥炬槸鍚﹀瓨鍦�"] = drawExists.ToString();
+            // 涓嶈烦杩囨鏌ョ殑鍔犲伐浠讹紝濡傛灉宸ョ▼鍥句笉瀛樺湪锛岃缃畁oDrw涓簍rue
+            if (!drawExists && !bom.skipCheck && bom.produceWay == "鍔犲伐浠�")
+            {
+                drawInfo.noDrw = true;
+            }
             allProperties["md5"] = bom.localD3Md5;
             if (bom.lost || bom.BomInfo.isHidden || sldDoc == null)
             {
@@ -1107,11 +1121,10 @@
                     if (!bom.skipCheck)
                     {
                         result[filepath] = GetSingleDrawInfo(bom);
+                        if (bom.BomInfo.inKeeDeeDb == true) result[filepath]._inKeeDeeDb = true;
+
                     }
                 }
-
-
-
 
                 ObservableCollection<PdmBom> children = bom.modules;
                 if (children != null)
@@ -1186,7 +1199,7 @@
             bool allSuccess = true;
             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 = 0;
             foreach (KeyValuePair<string, DrawInfo> property in properties)
@@ -1199,24 +1212,29 @@
                     try
                     {
                         Logger.Error($"{key} checking rule...");
+                        DrawInfo checkResult;
                         Result<DrawInfo> result = Client.PostSyncAction<DrawInfo>(property.Value, "wpf/bom/openApi/checkRuleSingle");
-                        DrawInfo checkResult = result.HandleResult();
+                        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))
+                        if (property.Value.noDrw || property.Value.isHidden || (!properties[key].HistoryData && (!checkResult.checkRuleOk)))
                         {
                             allSuccess = false;
                         }
 
-                        if (!properties[key].HistoryData)
+                        lock (temp)
                         {
-                            lock (temp)
+                            if (property.Value.isHidden)
                             {
-                                if (property.Value.isHidden)
-                                {
-                                    temp.Add($"鐗╂枡銆恵key}銆戣璁剧疆涓洪殣钘�!");
-                                }
+                                temp.Add($"鐗╂枡銆恵key}銆戣璁剧疆涓洪殣钘�!");
+                            }
+                            if (property.Value.noDrw && property.Value.HistoryData)
+                            {
+                                temp.Add($"鐗╂枡銆恵key}銆戞湭鎵惧埌宸ョ▼鍥�!");
+                            }
+                            if (!properties[key].HistoryData)
+                            {
                                 if (msgs != null && msgs.Count > 0)
                                 {
                                     foreach (string msg in msgs)
@@ -1419,6 +1437,12 @@
                 try
                 {
                     RefreshBomList(SwApp.IActiveDoc2);
+                    if (model.bomTreeReader.needSaveList.Count > 0)
+                    {
+                        List<string> infos = new List<string>(model.bomTreeReader.needSaveList);
+                        AutoSaveAlert(infos);
+                    }
+
                     if (!DoCheckRuleAsync(out List<string> msgs))
                     {
                         Dispatcher.Invoke(() =>
@@ -1468,7 +1492,7 @@
                 try
                 {
                     // 瀵规墍鏈夌殑BOM鍋氳鍒欐鏌�
-                    bool allSuccess = DoCheckRule(out _);
+                    bool allSuccess = DoCheckRuleAsync(out _);
                     // 鍏堣幏鍙栨墍鏈夌殑BOM
                     HashSet<string> cache = new HashSet<string>();
                     // 鐒跺悗绛涢�夐�変腑鐨凚OM
@@ -1497,12 +1521,20 @@
                     if (!allSuccess)
                     {
                         // 濡傛灉鏈夋湭閫氳繃鐨勫浘绾革紝闇�瑕佹彁绀�
-                        var err = boms.Where(b => !b.IsHistoryData && !b.checkRuleOk).ToList();
+                        var err = boms.Where(b => b.noDrw || b.isHidden || (!b.IsHistoryData && (!b.checkRuleOk))).ToList();
                         if (err != null && err.Count > 0)
                         {
                             List<string> msgs = new List<string>();
                             foreach (var ee in err)
                             {
+                                if (ee.noDrw && ee.IsHistoryData)
+                                {
+                                    msgs.Add($"鐗╂枡銆恵ee.partNo}銆戞湭閫氳繃瑙勫垯妫�鏌ワ紒鏈壘鍒板伐绋嬪浘");
+                                }
+                                if (ee.drawInfo.isHidden)
+                                {
+                                    msgs.Add($"鐗╂枡銆恵ee.partNo}銆戞湭閫氳繃瑙勫垯妫�鏌ワ紒琚涓洪殣钘�");
+                                }
                                 if (ee.drawInfo.errMessages == null)
                                 {
                                     msgs.Add($"鐗╂枡銆恵ee.partNo}銆戞湭閫氳繃瑙勫垯妫�鏌ワ紒");
@@ -1524,6 +1556,10 @@
                     }
 
                     // 閮介�氳繃浜嗭紝鍐嶈繘琛屽鎵�
+
+                    // 绛涢�夐潪鐗规畩鐨勫鏍�
+                    boms = boms.Where(b => !b._drawInfo.isSpecial).ToList();
+                    if (boms == null || boms.Count <= 0) return;
 
                     // 鍏堢敵璇峰崟鍙�
                     DrawAuditOrder daOrder = new DrawAuditOrder
@@ -1760,50 +1796,69 @@
         /// <param name="e"></param>
         private void TextBox_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e)
         {
-            // 妫�鏌ユ槸鍚︽槸鍙屽嚮
-            if (e.ClickCount == 2)
+            try
             {
-                TextBlock textBlock = sender as TextBlock;
-                PdmBom bom = textBlock.DataContext as PdmBom;
-                if (bom.checkRuleResult == 0)
+                // 妫�鏌ユ槸鍚︽槸鍙屽嚮
+                if (e.ClickCount == 2)
                 {
-                    this.Warning("璇ュ浘绾歌繕鏈鏌�");
-                    return;
-                }
-                if (bom.checkRuleResult == 3)
-                {
-                    string title = string.Empty;
-                    if (bom.IsHistoryData)
+                    TextBlock textBlock = sender as TextBlock;
+                    PdmBom bom = textBlock.DataContext as PdmBom;
+                    if (bom.checkRuleResult == 0)
                     {
-                        title = "鍘嗗彶鍥剧焊鏃犻渶妫�鏌�";
+                        this.Warning("璇ュ浘绾歌繕鏈鏌�");
+                        return;
                     }
-                    else if (bom.ExcludeFromBOM)
-                    {
-                        title = "涓嶅湪鐗╂枡鏄庣粏琛ㄤ腑鐨勭墿鏂欐棤闇�妫�鏌�";
-                    }
-                    else if (bom.component?.IsVirtual == true)
-                    {
-                        title = "铏氭嫙浠舵棤闇�妫�鏌�";
-                    }
-                    this.Info(title);
-                    return;
-                }
 
-                if (bom.checkRuleOk && !bom.isHidden)
-                {
-                    this.Show("瑙勫垯妫�鏌ラ�氳繃");
-                }
-                else
-                {
                     List<string> errs = new List<string>();
+                    if (bom.noDrw && bom.IsHistoryData)
+                    {
+                        errs.Add("宸ョ▼鍥句笉瀛樺湪 ");
+                    }
                     if (bom.isHidden)
                     {
                         errs.Add("鏂囨。琚缃负闅愯棌");
                     }
-                    errs.AddRange(bom.drawInfo.errMessages);
-                    MultiExWindow exWin = new MultiExWindow(this, "妫�鏌ョ粨鏋�", errs);
-                    exWin.ShowDialog();
+                    if (bom.drawInfo.errMessages != null)
+                    {
+                        errs.AddRange(bom.drawInfo.errMessages);
+                    }
+                    if (errs.Count > 0)
+                    {
+                        MultiExWindow exWin = new MultiExWindow(this, "妫�鏌ョ粨鏋�", errs);
+                        exWin.ShowDialog();
+                    }
+                    else if (bom.checkRuleResult == 3)
+                    {
+                        string title = string.Empty;
+                        if (bom.IsHistoryData)
+                        {
+                            title = "鍘嗗彶鍥剧焊鏃犻渶妫�鏌�";
+                        }
+                        else if (bom.ExcludeFromBOM)
+                        {
+                            title = "涓嶅湪鐗╂枡鏄庣粏琛ㄤ腑鐨勭墿鏂欐棤闇�妫�鏌�";
+                        }
+                        else if (bom.component?.IsVirtual == true)
+                        {
+                            title = "铏氭嫙浠舵棤闇�妫�鏌�";
+                        }
+                        else
+                        {
+                            title = "鏃犻渶妫�鏌�";
+                        }
+                        this.Info(title);
+                        return;
+                    }
+                    else if (bom.checkRuleOk && !bom.isHidden)
+                    {
+                        this.Show("瑙勫垯妫�鏌ラ�氳繃");
+                    }
                 }
+            }
+            catch (Exception ex)
+            {
+                Logger.Error("Double Click CheckRule Exception.", ex);
+                this.Error($"鏈煡寮傚父:{ex.Message}");
             }
         }
 
@@ -1814,59 +1869,77 @@
         /// <param name="e"></param>
         private void AuditTextBox_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e)
         {
-            // 妫�鏌ユ槸鍚︽槸鍙屽嚮
-            if (e.ClickCount == 2)
+            try
             {
-                TextBlock textBlock = sender as TextBlock;
-                PdmBom bom = textBlock.DataContext as PdmBom;
-                if (string.IsNullOrEmpty(bom.BomInfo.status))
+                // 妫�鏌ユ槸鍚︽槸鍙屽嚮
+                if (e.ClickCount == 2)
                 {
-                    if (bom.produceWay == "妯$粍" || bom.produceWay == "鏍囧噯浠�")
+                    TextBlock textBlock = sender as TextBlock;
+                    PdmBom bom = textBlock.DataContext as PdmBom;
+                    if (bom._drawInfo.isSpecial)
                     {
-                        this.Info($"{bom.produceWay}鏃犻渶瀹℃牳");
+                        this.Info("鏃犻渶瀹℃牳");
                         return;
                     }
-                    if (bom.IsHistoryData && !bom.localDocChanged)
+                    if (bom.BomInfo.inKeeDeeDb == true)
                     {
-                        this.Info("鍘嗗彶鍥剧焊鏃犻渶瀹℃牳");
+                        this.Info("宸插叆绯荤粺");
                         return;
                     }
-                    if (bom.IsHistoryData && bom.localDocChanged)
+                    if (string.IsNullOrEmpty(bom.BomInfo.status))
                     {
-                        this.Info("鍘嗗彶鍥剧焊涓�鑷存�у彉鏇达紝闇�瀹℃牳");
-                        return;
-                    }
-                    this.Warning("璇ュ浘绾告湭瀹℃牳");
-                    return;
-                }
-                MaskAdorner.ShowMask(content, "璇锋眰涓紝璇风◢鍚�...");
-                Task.Run(() =>
-                {
-                    try
-                    {
-                        Result<List<DrawAuditHis>> res = Client.GetSyncAction<List<DrawAuditHis>>("drawAudit/listTaskHis", new DrawAudit
+                        if (bom.produceWay == "妯$粍" || bom.produceWay == "鏍囧噯浠�")
                         {
-                            id = bom.BomInfo.id
-                        });
-                        var datas = res.HandleResult();
-                        Dispatcher.Invoke(() =>
+                            this.Info($"{bom.produceWay}鏃犻渶瀹℃牳");
+                            return;
+                        }
+                        if (bom.IsHistoryData && !bom.localDocChanged)
                         {
-                            //DrawAuditHisWindow window = new DrawAuditHisWindow(this, $"銆恵bom.partModel}銆戝鏍歌鎯�", datas);
-                            RichHisWindow window = new RichHisWindow(this, $"銆恵bom.partModel}銆戝鏍歌鎯�", datas);
+                            this.Info("鍘嗗彶鍥剧焊鏃犻渶瀹℃牳");
+                            return;
+                        }
+                        if (bom.IsHistoryData && bom.localDocChanged)
+                        {
+                            this.Info("鍘嗗彶鍥剧焊涓�鑷存�у彉鏇达紝闇�瀹℃牳");
+                            return;
+                        }
+                        this.Warning("璇ュ浘绾告湭瀹℃牳");
+                        return;
+                    }
+                    MaskAdorner.ShowMask(content, "璇锋眰涓紝璇风◢鍚�...");
+                    Task.Run(() =>
+                    {
+                        try
+                        {
+                            Result<List<DrawAuditHis>> res = Client.GetSyncAction<List<DrawAuditHis>>("drawAudit/listTaskHis", new DrawAudit
+                            {
+                                id = bom.BomInfo.id
+                            });
+                            var datas = res.HandleResult();
+                            Dispatcher.Invoke(() =>
+                            {
+                                //DrawAuditHisWindow window = new DrawAuditHisWindow(this, $"銆恵bom.partModel}銆戝鏍歌鎯�", datas);
+                                RichHisWindow window = new RichHisWindow(this, $"銆恵bom.partModel}銆戝鏍歌鎯�", datas);
 
-                            window.ShowDialog();
-                        });
-                    }
-                    catch (Exception ex)
-                    {
-                        Logger.Error($"V{PdmUser.LoginUser.pluginVersion}, Get draw audit history failed.", ex);
-                        this.Error($"V{PdmUser.LoginUser.pluginVersion}锛岃幏鍙栧鏍稿巻鍙插け璐ワ紒{ex.Message}");
-                    }
-                    finally
-                    {
-                        MaskAdorner.HideMask(content);
-                    }
-                });
+                                window.ShowDialog();
+                            });
+                        }
+                        catch (Exception ex)
+                        {
+                            Logger.Error($"V{PdmUser.LoginUser.pluginVersion}, Get draw audit history failed.", ex);
+                            this.Error($"V{PdmUser.LoginUser.pluginVersion}锛岃幏鍙栧鏍稿巻鍙插け璐ワ紒{ex.Message}");
+                        }
+                        finally
+                        {
+                            MaskAdorner.HideMask(content);
+                        }
+                    });
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.Error("Double Click Audit Status Exception.", ex);
+                this.Error($"鏈煡寮傚父:{ex.Message}");
             }
         }
 
@@ -1997,6 +2070,12 @@
                         {
                             throw new CantCheckInException(new List<string> { "璇锋墦寮�涓�寮犲浘绾�" });
                         }
+                        if (model.bomTreeReader.needSaveList.Count > 0)
+                        {
+                            List<string> infos = new List<string>(model.bomTreeReader.needSaveList);
+                            AutoSaveAlert(infos);
+                        }
+
                         DoCheckRuleAsync(out _);
                         // 绛涢�夋墍鏈夊湪鐗╂枡鏄庣粏琛ㄤ腑锛屼笉璺宠繃妫�鏌ュ苟涓旀鏌ユ湭閫氳繃鐨勶紝绫诲瀷鏄姞宸ヤ欢鐨勬湭閫氳繃瀹℃牳鐨勶紝鍔犲伐浠跺鏍搁�氳繃鐨勪絾鍥剧焊鍙樻洿鐨�
                         List<string> errs = model.bomTreeReader.CacheList.Select(b => b.NeedStopCheckIn())
diff --git a/PdmSwPlugin.PropertySetting/CommonSettingControl.xaml.cs b/PdmSwPlugin.PropertySetting/CommonSettingControl.xaml.cs
index c9ae722..2ab4104 100644
--- a/PdmSwPlugin.PropertySetting/CommonSettingControl.xaml.cs
+++ b/PdmSwPlugin.PropertySetting/CommonSettingControl.xaml.cs
@@ -234,26 +234,33 @@
 
         public void InitPropertyData()
         {
-            if (Client == null)
+            try
             {
-                Client = clientCreator.GetClient();
+                if (Client == null)
+                {
+                    Client = clientCreator.GetClient();
+                }
+                DefaultPanel defaultPanel = new DefaultPanel();
+                controlCache.Add("default", defaultPanel);
+
+                JgjPartPanel jgjPart = new JgjPartPanel();
+                controlCache.Add("jgjPart", jgjPart);
+
+                JgjModulePanel jgjModule = new JgjModulePanel();
+                controlCache.Add("jgjModule", jgjModule);
+
+                var stPart = new StandardPartPanel();
+                controlCache.Add("standardPart", stPart);
+
+                var stModule = new StandardModulePanel();
+                controlCache.Add("standardModule", stModule);
+                LoadComboxItemSource();
+                Refresh_Click(null, null);
             }
-            DefaultPanel defaultPanel = new DefaultPanel();
-            controlCache.Add("default", defaultPanel);
-
-            JgjPartPanel jgjPart = new JgjPartPanel();
-            controlCache.Add("jgjPart", jgjPart);
-
-            JgjModulePanel jgjModule = new JgjModulePanel();
-            controlCache.Add("jgjModule", jgjModule);
-
-            var stPart = new StandardPartPanel();
-            controlCache.Add("standardPart", stPart);
-
-            var stModule = new StandardModulePanel();
-            controlCache.Add("standardModule", stModule);
-            LoadComboxItemSource();
-            Refresh_Click(null, null);
+            catch (Exception ex)
+            {
+                Logger.Error($"PropertySetting Init Error!", ex);
+            }
         }
 
         private void Jgj_SinglePropertyChanged(object sender, string name, object value)
@@ -285,6 +292,8 @@
 
         private void UpdateActiveDoc()
         {
+            long start = DateTime.Now.Millisecond;
+            Logger.Debug("UpdateActiveDoc Start...");
             if (activeDoc != null)
             {
                 DetachDocNotify(activeDoc);
@@ -300,7 +309,11 @@
                     activeDoc.ClearSelection2(true);
                 }
             }
+            Logger.Debug($"UpdateActiveDoc End {activeDoc?.GetPathName()} {DateTime.Now.Millisecond - start}ms.");
+            start = DateTime.Now.Millisecond;
+            Logger.Debug("UpdateUI Start...");
             UpdateUI(activeDoc);
+            Logger.Debug($"UpdateUI End {activeDoc?.GetPathName()} {DateTime.Now.Millisecond - start}ms.");
         }
 
         /// <summary>
@@ -382,9 +395,10 @@
             ReadDoc = doc;
             Dispatcher.Invoke(() =>
             {
-                SwitchVisiable();
+                
                 // LoadDocProperties();
             });
+            SwitchVisiable();
         }
 
         private int Ass_UserSelectionPostNotify()
@@ -419,6 +433,9 @@
         /// </summary>
         private void SwitchVisiable()
         {
+            var start = DateTime.Now.Millisecond;
+            Logger.Debug("SwitchVisiable Start...");
+            
             HashSet<string> skipName = new HashSet<string> {
                 NameConstant.materialCode
             };
@@ -522,9 +539,15 @@
                 last = null;
             }
             ActiveOpter = control;
-            contentPanel.Children.Clear();
             newOne.UpdateProperty += Jgj_SinglePropertyChanged;
-            contentPanel.Children.Add(control);
+
+            Dispatcher.Invoke(() =>
+            {
+                contentPanel.Children.Clear();
+                contentPanel.Children.Add(control);
+            });
+
+            Logger.Debug($"SwitchVisiable End {activeDoc?.GetPathName()} {DateTime.Now.Millisecond - start}ms.");
         }
 
         /// <summary>
@@ -694,11 +717,19 @@
 
         private void SaveButton_Click(object sender, RoutedEventArgs e)
         {
-            if (ReadDoc == null)
+            try
             {
-                return;
+                if (ReadDoc == null)
+                {
+                    return;
+                }
+                SaveDoc(false);
             }
-            SaveDoc(false);
+            catch (Exception ex)
+            {
+                Logger.Error($"Property Setting Save Doc Error!", ex);
+                this.Error($"淇濆瓨澶辫触!{ex.Message}");
+            }
         }
 
         public void RefreshData()
@@ -773,12 +804,20 @@
 
         public void OnCustomPropertyChange(string propName, string Configuration, string oldValue, string NewValue, int valueType)
         {
-            if (oldValue == NewValue)
+            try
             {
-                return;
+                if (oldValue == NewValue)
+                {
+                    return;
+                }
+                IPropertyOpt opt = ActiveOpter as IPropertyOpt;
+                opt.UpdateSingleProperty(propName, NewValue);
             }
-            IPropertyOpt opt = ActiveOpter as IPropertyOpt;
-            opt.UpdateSingleProperty(propName, NewValue);
+            catch (Exception ex)
+            {
+                Logger.Error("Property Setting OnCustomPropertyChange Error!", ex);
+                this.Error($"灞炴�у彉鏇村紓甯革紒{ex.Message}");
+            }
         }
 
         public void OnDocDestroy(ModelDoc2 doc)
@@ -796,6 +835,8 @@
         /// </summary>
         public void AlertSaveWindow()
         {
+            var start = DateTime.Now.Millisecond;
+            Logger.Debug("AlertSaveWindow Start...");
             IPropertyOpt opt = ActiveOpter as IPropertyOpt;
             if (opt != null && opt.GetDocChanged())
             {
@@ -818,29 +859,38 @@
                     opt.ResetProperty(out string errMsg);
                 }
             }
+            Logger.Debug($"AlertSaveWindow End {activeDoc?.GetPathName()} {DateTime.Now.Millisecond - start}ms.");
         }
 
         public void OnTabControlSelectionChange(object sender, SelectionChangedEventArgs e)
         {
-            if (e.RemovedItems == null)
+            try
             {
-                return;
-            }
-
-            foreach (object obj in e.RemovedItems)
-            {
-                if (obj is TabItem item)
-                {
-                    if (item.Content == this)
-                    {
-                        AlertSaveWindow();
-                        break;
-                    }
-                }
-                else
+                if (e.RemovedItems == null)
                 {
                     return;
                 }
+
+                foreach (object obj in e.RemovedItems)
+                {
+                    if (obj is TabItem item)
+                    {
+                        if (item.Content == this)
+                        {
+                            AlertSaveWindow();
+                            break;
+                        }
+                    }
+                    else
+                    {
+                        return;
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.Error($"Property Setting OnTabControlSelectionChange Error!", ex);
+                this.Error($"{ex.Message}");
             }
         }
     }

--
Gitblit v1.9.1