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
{
///
/// UserControl1.xaml 的交互逻辑
///
[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(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);
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;
}
///
/// 全选事件
///
///
///
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;
}
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} 条";
}
///
/// 单个点选事件
///
///
///
private void SingleCheckBox_Event(object sender, RoutedEventArgs e)
{
RefreshSelectedCount();
}
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($"V{PdmUser.LoginUser.pluginVersion}, UI update failed.", ex);
this.Error($"V{PdmUser.LoginUser.pluginVersion},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($"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 RefreshList()
{
try
{
string statusArr = string.Empty;
Dispatcher.Invoke(() =>
{
List arr = new List();
if (subcb.IsChecked == true) arr.Add("submitted");
if (resubcb.IsChecked == true) arr.Add("resubmitted");
if (comcb.IsChecked == true) arr.Add("completed");
if (rejcb.IsChecked == true) arr.Add("rejected");
if (arr.Count > 0)
{
statusArr = $"'{string.Join("','", arr)}'";
}
});
Result> res = Client.GetSyncAction>("drawAudit/listWithTask2", new DrawAudit
{
statusArr = statusArr
});
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();
}
}
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);
}
}
///
/// 单条数据通过按钮点击事件
///
///
///
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