using PdmSwPlugin.Commmon.Util.UI;
using PdmSwPlugin.Common.Util;
using PdmSwPlugin.Common;
using PdmSwPlugin.Common.Constants;
using PdmSwPlugin.Common.Interface;
using PdmSwPlugin.Common.Util.Http;
using PdmSwPlugin.Common.Util.Pdm;
using PdmSwPlugin.PriceCheck.Model;
using PdmSwPlugin.PriceCheck.Param;
using PdmSwPlugin.PriceCheck.Util;
using SolidWorks.Interop.sldworks;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
using System.Windows.Controls;
using PdmSwPlugin.Common.Setting;
namespace PdmSwPlugin.PriceCheck
{
///
/// MainWindow.xaml 的交互逻辑
///
[PdmSwPlugin(Title = "加工件核价")]
public partial class PriceCheckControl : UserControl, ISwAppSetter
{
private SldWorks SwApp;
SldWorks ISwAppSetter.SwApp => SwApp;
private HttpClient Client;
// 缓存服务器返回的工艺数据
private Technology tech { get; set; }
private PriceCheckModel Model;
private ModelProperty ModelProperty => Model.ModelProperty;
private TaibanControl taibanControl;
private BanjinControl banjinControl;
private JgjControl jgjControl;
private HttpClientCreator clientCreator { get; set; }
///
/// 属性变更事件
///
private event Action PropertyChanged;
public PriceCheckControl() : base()
{
clientCreator = new HttpClientCreator(new HttpConfig(PluginSetting.Instance.BaseAddress));
InitializeComponent();
}
public PriceCheckControl(SldWorks SwApp) : this()
{
this.SwApp = SwApp;
PropertyChanged += ReDoCountWhenPropertyChanged;
Model = new PriceCheckModel(SwApp, PropertyChanged);
taibanControl = new TaibanControl(Model.ModelProperty);
banjinControl = new BanjinControl(Model.ModelProperty, SwApp);
jgjControl = new JgjControl(Model.ModelProperty);
Client = clientCreator.GetClient();
DataContext = Model;
InitializeComponent();
}
public void SetSwApp(SldWorks SwApp)
{
this.SwApp = SwApp;
banjinControl.swApp = SwApp;
}
private async void Button_Click(object sender, System.Windows.RoutedEventArgs e)
{
MaskAdorner.ShowMask(mainPanel);
try
{
await Task.Run(() =>
{
RefreshModelInfo(out string errorInfo);
if (errorInfo != null)
{
this.Warning(errorInfo);
}
});
}
finally
{
MaskAdorner.HideMask(mainPanel);
}
}
private async void Calculate_Click(object sender, System.Windows.RoutedEventArgs e)
{
MaskAdorner.ShowMask(mainPanel);
try
{
ReDoCountWhenPropertyChanged();
}
finally
{
MaskAdorner.HideMask(mainPanel);
}
}
///
/// 刷新整个核价页面
///
/// 刷新过程中的错误信息,没有就返回NULL
private void RefreshModelInfo(out string errorInfo)
{
try
{
// 读取长宽高,加工件类型,材料等基础参数
ModelReader.RefreshModelInfo(SwApp, Model.ModelProperty, out errorInfo);
Technology tech;
if (errorInfo != null)
{
// 有错误
Model.ModelProperty = new ModelProperty();
tech = new Technology();
}
else
{
ModelInfo param = new ModelInfo()
{
stuff = Model.ModelProperty.stuffType,
type = Model.ModelProperty.type,
surfaceTreatment = Model.ModelProperty.surfaceType,
heatTreatment = Model.ModelProperty.heatType
};
Result res = Client.GetSyncAction("wpf/openApi/priceCheck/select", param);
tech = res.HandleResult();
this.tech = tech;
}
// 根据加工件类型决定customPanel的内容
Dispatcher.Invoke(() =>
{
Model.PropertyList.Clear();
customPanel.Children.Clear();
string message = null;
switch (ModelProperty.type)
{
case "台板":
taibanControl.DoCount(tech, out message);
customPanel.Children.Add(taibanControl);
break;
case "钣金":
try
{
// 钣金需要展开后重新计算长宽高
banjinControl.ReSetProperty2();
}
catch (Exception e)
{
// 计算失败就失败了,可以手动改长宽高
}
banjinControl.DoCount(tech, out message);
customPanel.Children.Add(banjinControl);
break;
case "金属加工件":
jgjControl.DoCount(tech, out message);
customPanel.Children.Add(jgjControl);
break;
case "树脂加工件":
jgjControl.DoCount(tech, out message);
customPanel.Children.Add(jgjControl);
break;
default:
break;
}
Model.PropertyList.Add(Model.ModelProperty);
if (message != null)
{
this.Warning(message);
}
});
}
catch (Exception ex)
{
errorInfo = string.Format("获取模型信息时发生异常:{0}", ex.ToString());
return;
}
}
///
/// 上传核价按钮
///
///
///
private async void SendToServer_Click(object sender, System.Windows.RoutedEventArgs e)
{
MaskAdorner.ShowMask(mainPanel);
try
{
var children = customPanel.Children;
double price = 0;
string message;
foreach (var child in children)
{
PriceCounter counter = child as PriceCounter;
price += counter.GetPrice(out message);
if (message != null)
{
this.Warning(message);
return;
}
}
if (price <= 0)
{
this.Warning("请上传正确的核价");
return;
}
await Task.Run(() =>
{
SendToServer(price);
});
}
finally
{
MaskAdorner.HideMask(mainPanel);
}
}
private void SendToServer(double price)
{
try
{
string partModel = ModelUtil.GetPartModelFromName(ModelProperty.name);
Result