using log4net; 
 | 
using PdmSwPlugin.Commmon.Control; 
 | 
using PdmSwPlugin.Commmon.Util.UI; 
 | 
using PdmSwPlugin.Common; 
 | 
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 SolidWorks.Interop.sldworks; 
 | 
using SolidWorks.Interop.swconst; 
 | 
using System; 
 | 
using System.Collections.Generic; 
 | 
using System.Collections.ObjectModel; 
 | 
using System.ComponentModel; 
 | 
using System.IO; 
 | 
using System.Linq; 
 | 
using System.Net.Http; 
 | 
using System.Runtime.CompilerServices; 
 | 
using System.Threading.Tasks; 
 | 
using System.Windows; 
 | 
using System.Windows.Controls; 
 | 
  
 | 
namespace PdmSwPlugin.DrawApprove 
 | 
{ 
 | 
    /// <summary> 
 | 
    /// UserControl1.xaml 的交互逻辑 
 | 
    /// </summary> 
 | 
    [PdmSwPlugin(Title = "图纸审批")] 
 | 
    public partial class DrawApproveControl : UserControl, ISwAppSetter, INotifyPropertyChanged, IActiveDocChangeHandler 
 | 
    { 
 | 
        #region ... 
 | 
        public virtual event PropertyChangedEventHandler PropertyChanged; 
 | 
  
 | 
        public virtual void RaisePropertyChanged(string name) 
 | 
        { 
 | 
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); 
 | 
        } 
 | 
  
 | 
        public void RaiseAndSetIfChanged<T>(ref T old, T @new, [CallerMemberName] string propertyName = null) 
 | 
        { 
 | 
            old = @new; 
 | 
            if (propertyName != null) 
 | 
            { 
 | 
                RaisePropertyChanged(propertyName); 
 | 
            } 
 | 
        } 
 | 
        #endregion 
 | 
  
 | 
        private static ILog Logger = LogManager.GetLogger("DrawApprove"); 
 | 
  
 | 
        SldWorks SwApp; 
 | 
  
 | 
        SldWorks ISwAppSetter.SwApp => SwApp; 
 | 
  
 | 
        private readonly HttpClient Client; 
 | 
        private HttpClientCreator clientCreator { get; set; } 
 | 
  
 | 
        /// <summary> 
 | 
        /// 全部BOM树状结构 
 | 
        /// </summary> 
 | 
        private ObservableCollection<DrawAudit> _dataSource = new ObservableCollection<DrawAudit>(); 
 | 
        public ObservableCollection<DrawAudit> dataSource 
 | 
        { 
 | 
            get => _dataSource; 
 | 
            set 
 | 
            { 
 | 
                RaiseAndSetIfChanged(ref _dataSource, value); 
 | 
                if (value == null) 
 | 
                { 
 | 
                    StatusBarText = $"共 0 条"; 
 | 
                } 
 | 
                else 
 | 
                { 
 | 
                    StatusBarText = $"共 {value.Count} 条"; 
 | 
                } 
 | 
                RefreshSelectedCount(); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        private string _SelectBomText = "已选中 0 条"; 
 | 
        public string SelectBomText 
 | 
        { 
 | 
            get => _SelectBomText; 
 | 
            set => RaiseAndSetIfChanged(ref _SelectBomText, value); 
 | 
        } 
 | 
  
 | 
        private string _StatusBarText = "共 0 条"; 
 | 
  
 | 
        public string StatusBarText 
 | 
        { 
 | 
            get { return _StatusBarText; } 
 | 
            set => RaiseAndSetIfChanged(ref _StatusBarText, value); 
 | 
        } 
 | 
  
 | 
  
 | 
  
 | 
        public DrawApproveControl() : this(null) 
 | 
        { 
 | 
  
 | 
        } 
 | 
  
 | 
        public DrawApproveControl(SldWorks swAddin) 
 | 
        { 
 | 
            SwApp = swAddin; 
 | 
            InitializeComponent(); 
 | 
            clientCreator = new HttpClientCreator(new HttpConfig(PluginSetting.Instance.BaseAddress)); 
 | 
            Client = clientCreator.GetClient(); 
 | 
            DataContext = this; 
 | 
        } 
 | 
  
 | 
        public void SetSwApp(SldWorks SwApp) 
 | 
        { 
 | 
            this.SwApp = SwApp; 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// 全选事件 
 | 
        /// </summary> 
 | 
        /// <param name="sender"></param> 
 | 
        /// <param name="e"></param> 
 | 
        private void GlobalCheckBox_Checked(object sender, RoutedEventArgs e) 
 | 
        { 
 | 
            CheckBox cb = sender as CheckBox; 
 | 
            List<DrawAudit> datas = dataSource.ToList(); 
 | 
            foreach (DrawAudit data in datas) 
 | 
            { 
 | 
                data.selected = cb.IsChecked.Value; 
 | 
            } 
 | 
            int count = cb.IsChecked.Value ? (dataSource == null ? 0 : dataSource.Count) : 0; 
 | 
            SelectBomText = $"已选中 {count} 条"; 
 | 
        } 
 | 
  
 | 
        private void RefreshSelectedCount() 
 | 
        { 
 | 
            if (dataSource == null || dataSource.Count <= 0) 
 | 
            { 
 | 
                SelectBomText = "已选中 0 条"; 
 | 
                return; 
 | 
            } 
 | 
            int count = dataSource.Where(e => e.selected).Count(); 
 | 
            SelectBomText = $"已选中 {count} 条"; 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// 单个点选事件 
 | 
        /// </summary> 
 | 
        /// <param name="sender"></param> 
 | 
        /// <param name="e"></param> 
 | 
        private void SingleCheckBox_Event(object sender, RoutedEventArgs e) 
 | 
        { 
 | 
            RefreshSelectedCount(); 
 | 
        } 
 | 
  
 | 
  
 | 
  
 | 
        private void Button_Click(object sender, RoutedEventArgs e) 
 | 
        { 
 | 
            MaskAdorner.ShowMask(content, "请求中,请稍后..."); 
 | 
            Task.Run(() => 
 | 
            { 
 | 
                try 
 | 
                { 
 | 
                    List<DrawAudit> datas = RefreshList(); 
 | 
                    Dispatcher.Invoke(() => 
 | 
                    { 
 | 
                        dataSource = new ObservableCollection<DrawAudit>(datas); 
 | 
                    }); 
 | 
                } 
 | 
                catch (Exception ex) 
 | 
                { 
 | 
                    Logger.Error($"V{PdmUser.LoginUser.pluginVersion}, UI update failed.", ex); 
 | 
                    this.Error($"V{PdmUser.LoginUser.pluginVersion},UI更新列表失败!异常:{ex}"); 
 | 
                    dataSource = new ObservableCollection<DrawAudit>(); 
 | 
                } 
 | 
                finally 
 | 
                { 
 | 
                    MaskAdorner.HideMask(content); 
 | 
                } 
 | 
            }); 
 | 
        } 
 | 
  
 | 
        private void OpenDocMayError(string filePath, int docType, int option, string config) 
 | 
        { 
 | 
            int err = 0, warn = 0; 
 | 
            SwApp.OpenDoc6(filePath, docType, option, config, ref err, ref warn); 
 | 
            if (err == (int)swFileLoadError_e.swAddinInteruptError) 
 | 
            { 
 | 
                this.Error("打开失败!用户尝试打开文件,然后中断打开文件例程以打开其他文件"); 
 | 
            } 
 | 
            else if (err == (int)swFileLoadError_e.swApplicationBusy) 
 | 
            { 
 | 
                this.Error("打开失败!Solidworks繁忙"); 
 | 
            } 
 | 
            else if (err == (int)swFileLoadError_e.swFileCriticalDataRepairError) 
 | 
            { 
 | 
                this.Error("打开失败!文档存在严重数据损坏"); 
 | 
            } 
 | 
            else if (err == (int)swFileLoadError_e.swFileNotFoundError) 
 | 
            { 
 | 
                this.Error("打开失败!无法找到文件;未加载文件或禁止显示引用的文件(即组件)"); 
 | 
            } 
 | 
            else if (err == (int)swFileLoadError_e.swFileRequiresRepairError) 
 | 
            { 
 | 
                this.Error("打开失败!文档具有非关键自定义属性数据损坏"); 
 | 
            } 
 | 
            else if (err == (int)swFileLoadError_e.swFutureVersion) 
 | 
            { 
 | 
                this.Error("打开失败!文档已保存在 SOLIDWORKS 的未来版本中"); 
 | 
            } 
 | 
            else if (err == (int)swFileLoadError_e.swInvalidFileTypeError) 
 | 
            { 
 | 
                this.Error("打开失败!文件类型参数无效"); 
 | 
            } 
 | 
            else if (err == (int)swFileLoadError_e.swLiquidMachineDoc) 
 | 
            { 
 | 
                this.Error("打开失败!由 Liquid Machines 加密的文件"); 
 | 
            } 
 | 
            else if (err == (int)swFileLoadError_e.swLowResourcesError) 
 | 
            { 
 | 
                this.Error("打开失败!文件被打开并被阻止,因为系统内存不足,或者 GDI 句柄数已超过允许的最大值"); 
 | 
            } 
 | 
            else if (err == (int)swFileLoadError_e.swNoDisplayData) 
 | 
            { 
 | 
                this.Error("打开失败!文件不包含显示数据"); 
 | 
            } 
 | 
            else if (err == (int)swFileLoadError_e.swFileWithSameTitleAlreadyOpen) 
 | 
            { 
 | 
                this.Error("打开失败!具有相同名称的文档已打开"); 
 | 
                //SwApp.ActivateDoc3(filePath, false, 0, ref err); 
 | 
                //if (err == 2) 
 | 
                //{ 
 | 
                //    this.Error("需要重新生成已激活的文档"); 
 | 
                //} 
 | 
                //else if (err == 1) 
 | 
                //{ 
 | 
                //    this.Error("遇到不明错误,并且未激活文档"); 
 | 
                //} 
 | 
            } 
 | 
            else if (err != 0) 
 | 
            { 
 | 
                Logger.Error($"V{PdmUser.LoginUser.pluginVersion}, OpenDoc6 Failed,Error:{err}.See Solidworks Doc."); 
 | 
            } 
 | 
            else if (warn == 128) 
 | 
            { 
 | 
                SwApp.ActivateDoc3(filePath, false, 0, ref err); 
 | 
                if (err == 2) 
 | 
                { 
 | 
                    this.Error("需要重新生成已激活的文档"); 
 | 
                } 
 | 
                else if (err == 1) 
 | 
                { 
 | 
                    this.Error("遇到不明错误,并且未激活文档"); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
  
 | 
        private void OpenDrw_Click(object sender, RoutedEventArgs e) 
 | 
        { 
 | 
            Button btn = sender as Button; 
 | 
            DrawAudit da = btn.DataContext as DrawAudit; 
 | 
            string filePath = GetRealFilePath(da.d2RelativePath); 
 | 
            if (!File.Exists(filePath)) 
 | 
            { 
 | 
                this.Error($"服务器中未找到工程图文件,路径:{filePath}"); 
 | 
                return; 
 | 
            } 
 | 
            OpenDocMayError(filePath, (int)swDocumentTypes_e.swDocDRAWING, (int)swOpenDocOptions_e.swOpenDocOptions_ReadOnly, 
 | 
                ""); 
 | 
        } 
 | 
  
 | 
        private string GetRealFilePath(string relativePath) 
 | 
        { 
 | 
            // string fileName = Path.GetFileName(dbPath); 
 | 
            // string filePath = Path.Combine(PluginSetting.Instance.SwFilePath, dbPath); 
 | 
            string filePath = PluginSetting.Instance.SwFilePath + relativePath; 
 | 
            return filePath; 
 | 
        } 
 | 
  
 | 
        private void OpenDoc_Click(object sender, RoutedEventArgs e) 
 | 
        { 
 | 
            Button btn = sender as Button; 
 | 
            DrawAudit da = btn.DataContext as DrawAudit; 
 | 
            string filePath = GetRealFilePath(da.d3RelativePath); 
 | 
            if (!File.Exists(filePath)) 
 | 
            { 
 | 
                this.Error($"服务器中未找到图纸文件,路径:{filePath}"); 
 | 
                return; 
 | 
            } 
 | 
  
 | 
            OpenDocMayError(filePath, (int)FileExtentionChecker.Check(filePath, out _), (int)swOpenDocOptions_e.swOpenDocOptions_ReadOnly, 
 | 
                 ""); 
 | 
        } 
 | 
  
 | 
        public List<DrawAudit> RefreshList() 
 | 
        { 
 | 
            try 
 | 
            { 
 | 
                Result<List<DrawAudit>> res = Client.GetSyncAction<List<DrawAudit>>("drawAudit/listWithTask"); 
 | 
                return res.HandleResult(); 
 | 
            } 
 | 
            catch (Exception ex) 
 | 
            { 
 | 
                Logger.Error($"V{PdmUser.LoginUser.pluginVersion}, Get draw audit data list failed.", ex); 
 | 
                this.Error($"V{PdmUser.LoginUser.pluginVersion},刷新列表失败!异常:{ex.Message}"); 
 | 
                return new List<DrawAudit>(); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        public void CloseAuditedDoc(DrawAudit da) 
 | 
        { 
 | 
            try 
 | 
            { 
 | 
                string modelPath = GetRealFilePath(da.d3RelativePath); 
 | 
                string drawingPath = GetRealFilePath(da.d2RelativePath); 
 | 
                SwApp.CloseDoc(modelPath); 
 | 
                SwApp.CloseDoc(drawingPath); 
 | 
            } 
 | 
            catch (Exception exx) 
 | 
            { 
 | 
                Logger.Error($"V{PdmUser.LoginUser.pluginVersion}, Auto close open doc failed.", exx); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// 单条数据通过按钮点击事件 
 | 
        /// </summary> 
 | 
        /// <param name="sender"></param> 
 | 
        /// <param name="e"></param> 
 | 
        private void Resolve_Click(object sender, RoutedEventArgs e) 
 | 
        { 
 | 
            Button btn = sender as Button; 
 | 
            DrawAudit da = btn.DataContext as DrawAudit; 
 | 
            if (da.status != "submitted" && da.status != "resubmitted") 
 | 
            { 
 | 
                this.Warning("请选择已提交的数据"); 
 | 
                return; 
 | 
            } 
 | 
            MessageBoxResult mr = MessageBox.Show($"确定通过物料【{da.materialCode}】的图纸审批吗?", "提示", MessageBoxButton.OKCancel, MessageBoxImage.Question); 
 | 
            if (mr == MessageBoxResult.OK) 
 | 
            { 
 | 
                MaskAdorner.ShowMask(content, "请求中,请稍候..."); 
 | 
                Task.Run(() => 
 | 
                { 
 | 
                    try 
 | 
                    { 
 | 
                        string filePath = GetRealFilePath(da.d3RelativePath); 
 | 
                        if (!File.Exists(filePath)) 
 | 
                        { 
 | 
                            this.Error($"服务器中未找到图纸文件,路径:{filePath}"); 
 | 
                            return; 
 | 
                        } 
 | 
  
 | 
                        double[] massData = SwDMUtil.GetMassProperty(filePath, out string errMsg); 
 | 
                        if (massData == null) 
 | 
                        { 
 | 
                            this.Error($"获取图纸一致性数据失败!{errMsg}"); 
 | 
                            return; 
 | 
                        } 
 | 
                        da.fileName = Path.GetFileName(filePath); 
 | 
                        da.volume = NumberUtil.HandleMass(massData[3]); 
 | 
                        da.surfaceArea = NumberUtil.HandleMass(massData[4]); 
 | 
                        da.mass = NumberUtil.HandleMass(massData[5]); 
 | 
                        da.pass = true; 
 | 
                        Result<object> res = Client.PostSyncAction<object>(da, "drawAudit/complete"); 
 | 
                        object obj = res.HandleResult(); 
 | 
                        CloseAuditedDoc(da); 
 | 
                        Dispatcher.Invoke(() => 
 | 
                        { 
 | 
                            dataSource = new ObservableCollection<DrawAudit>(RefreshList()); 
 | 
                        }); 
 | 
                    } 
 | 
                    catch (Exception ex) 
 | 
                    { 
 | 
                        Logger.Error($"V{PdmUser.LoginUser.pluginVersion}, Draw complete failed.", ex); 
 | 
                        this.Error($"V{PdmUser.LoginUser.pluginVersion},审核失败!{ex.Message}"); 
 | 
                    } 
 | 
                    finally 
 | 
                    { 
 | 
                        MaskAdorner.HideMask(content); 
 | 
                    } 
 | 
                }); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// 单条数据驳回按钮点击事件 
 | 
        /// </summary> 
 | 
        /// <param name="sender"></param> 
 | 
        /// <param name="e"></param> 
 | 
        private void Reject_Click(object sender, RoutedEventArgs e) 
 | 
        { 
 | 
            Button btn = sender as Button; 
 | 
            DrawAudit da = btn.DataContext as DrawAudit; 
 | 
            if (da.status != "submitted" && da.status != "resubmitted") 
 | 
            { 
 | 
                this.Warning("请选择已提交的数据"); 
 | 
                return; 
 | 
            } 
 | 
            //RejectWindow window = new RejectWindow($"{da.materialCode}驳回说明", da, Client, Logger, SwApp); 
 | 
            //window.ShowDialog(); 
 | 
  
 | 
            XamlWindow window = new XamlWindow($"{da.materialCode}驳回说明", da, Client, Logger, SwApp); 
 | 
            if (window.ShowDialog() == true) 
 | 
            { 
 | 
                CloseAuditedDoc(da); 
 | 
            } 
 | 
  
 | 
            //WebWindow window = new WebWindow(da); 
 | 
            //window.ShowDialog(); 
 | 
  
 | 
            Dispatcher.Invoke(() => 
 | 
            { 
 | 
                dataSource = new ObservableCollection<DrawAudit>(RefreshList()); 
 | 
            }); 
 | 
        } 
 | 
  
 | 
        private void TextBlock_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) 
 | 
        { 
 | 
            // 检查是否是双击 
 | 
            if (e.ClickCount == 2) 
 | 
            { 
 | 
                TextBlock textBlock = sender as TextBlock; 
 | 
                DrawAudit data = textBlock.DataContext as DrawAudit; 
 | 
                MaskAdorner.ShowMask(content, "请求中,请稍后..."); 
 | 
                Task.Run(() => 
 | 
                { 
 | 
                    try 
 | 
                    { 
 | 
                        Result<List<DrawAuditHis>> res = Client.GetSyncAction<List<DrawAuditHis>>("drawAudit/listTaskHis", new DrawAudit 
 | 
                        { 
 | 
                            id = data.id 
 | 
                        }); 
 | 
                        var datas = res.HandleResult(); 
 | 
                        Dispatcher.Invoke(() => 
 | 
                        { 
 | 
                            //DrawAuditHisWindow window = new DrawAuditHisWindow(this, $"【{bom.partModel}】审核详情", datas); 
 | 
                            RichHisWindow window = new RichHisWindow(this, $"【{data.materialCode}】审核详情", 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); 
 | 
                    } 
 | 
                }); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        public void OnSwActiveDocChange(ModelDoc2 oldDoc, ModelDoc2 newDoc, Component2 comp) 
 | 
        { 
 | 
            var fileName = new Uri(newDoc.GetPathName()); 
 | 
            foreach (var e in dataSource) 
 | 
            { 
 | 
                var d2Path = new Uri(GetRealFilePath(e.d2RelativePath)); 
 | 
                var d3Path = new Uri(GetRealFilePath(e.d3RelativePath)); 
 | 
                e.IsOpening = fileName == d2Path || fileName == d3Path; 
 | 
            } 
 | 
        } 
 | 
  
 | 
        public void OnSwActiveDocSaved(ModelDoc2 doc, Component2 comp) 
 | 
        { 
 | 
             
 | 
        } 
 | 
  
 | 
        public void OnCustomPropertyChange(string propName, string Configuration, string oldValue, string NewValue, int valueType) 
 | 
        { 
 | 
             
 | 
        } 
 | 
  
 | 
        public void OnDocDestroy(ModelDoc2 doc) 
 | 
        { 
 | 
            
 | 
        } 
 | 
  
 | 
        public void AfterDocDestroy() 
 | 
        { 
 | 
             
 | 
        } 
 | 
    } 
 | 
} 
 |