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