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.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 { /// /// UserControl1.xaml 的交互逻辑 /// [PdmSwPlugin(Title = "图纸审批")] public partial class DrawApproveControl : UserControl, ISwAppSetter, INotifyPropertyChanged { #region ... public virtual event PropertyChangedEventHandler PropertyChanged; public virtual void RaisePropertyChanged(string name) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); } public void RaiseAndSetIfChanged(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; } /// /// 全部BOM树状结构 /// private ObservableCollection _dataSource = new ObservableCollection(); public ObservableCollection dataSource { get => _dataSource; set => RaiseAndSetIfChanged(ref _dataSource, 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; } /// /// 全选事件 /// /// /// private void GlobalCheckBox_Checked(object sender, RoutedEventArgs e) { CheckBox cb = sender as CheckBox; List datas = dataSource.ToList(); foreach (DrawAudit data in datas) { data.selected = cb.IsChecked.Value; } } private void Button_Click(object sender, RoutedEventArgs e) { MaskAdorner.ShowMask(content, "请求中,请稍后..."); Task.Run(() => { try { List datas = RefreshList(); Dispatcher.Invoke(() => { dataSource = new ObservableCollection(datas); }); } catch (Exception ex) { Logger.Error("UI update failed.", ex); this.Error($"UI更新列表失败!异常:{ex}"); dataSource = new ObservableCollection(); } 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($"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 fileName = Path.GetFileName(da.d2RelativePath); if (string.IsNullOrEmpty(fileName)) { this.Error("无效文件名"); return; } fileName = Path.Combine(PluginSetting.Instance.SwFilePath, fileName); if (!File.Exists(fileName)) { this.Error($"服务器中未找到工程图文件,路径:{fileName}"); return; } OpenDocMayError(fileName, (int)swDocumentTypes_e.swDocDRAWING, (int)swOpenDocOptions_e.swOpenDocOptions_ReadOnly, ""); } private void OpenDoc_Click(object sender, RoutedEventArgs e) { Button btn = sender as Button; DrawAudit da = btn.DataContext as DrawAudit; string fileName = Path.GetFileName(da.d3RelativePath); if (string.IsNullOrEmpty(fileName)) { this.Error("无效文件名"); return; } fileName = Path.Combine(PluginSetting.Instance.SwFilePath, fileName); if (!File.Exists(fileName)) { this.Error($"服务器中未找到工程图文件,路径:{fileName}"); return; } OpenDocMayError(fileName, (int)swDocumentTypes_e.swDocPART, (int)swOpenDocOptions_e.swOpenDocOptions_ReadOnly, ""); } public List RefreshList() { try { Result> res = Client.GetSyncAction>("drawAudit/listWithTask"); return res.HandleResult(); } catch (Exception ex) { Logger.Error("Get draw audit data list failed.", ex); this.Error($"刷新列表失败!异常:{ex.Message}"); return new List(); } } public void CloseAuditedDoc(DrawAudit da) { try { string modelPath = Path.Combine(PluginSetting.Instance.SwFilePath, Path.GetFileName(da.d3RelativePath)); string drawingPath = Path.Combine(PluginSetting.Instance.SwFilePath, Path.GetFileName(da.d2RelativePath)); SwApp.CloseDoc(modelPath); SwApp.CloseDoc(drawingPath); } catch (Exception exx) { Logger.Error("Auto close open doc failed.", exx); } } /// /// 单条数据通过按钮点击事件 /// /// /// 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 { da.pass = true; Result res = Client.PostSyncAction(da, "drawAudit/complete"); object obj = res.HandleResult(); CloseAuditedDoc(da); Dispatcher.Invoke(() => { dataSource = new ObservableCollection(RefreshList()); }); } catch (Exception ex) { Logger.Error("Draw complete failed.", ex); } finally { MaskAdorner.HideMask(content); } }); } } /// /// 单条数据驳回按钮点击事件 /// /// /// 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(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> res = Client.GetSyncAction>("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("Get draw audit history failed.", ex); this.Error($"获取审核历史失败!{ex.Message}"); } finally { MaskAdorner.HideMask(content); } }); } } } }