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()
|
{
|
|
}
|
}
|
}
|