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 result = Client.PostSyncAction(new Dictionary() { { "machineNo",partModel}, { "price",price}, { "machinePartType",ModelProperty.type}, { "officer",System.Environment.UserName}, }, "wpf/openApi/priceCheck/savePriceCheck"); object obj = result.HandleResult(); this.Info("上传成功"); } catch (Exception e) { this.Error(e.Message); } } /// /// 手动变更基础属性后,重新计算所有相关数据 /// private void ReDoCountWhenPropertyChanged() { // 只能在UI线程触发,不然就报错。垃圾 Dispatcher.Invoke(() => { var children = customPanel.Children; string message; foreach (var child in children) { PriceCounter counter = child as PriceCounter; counter.DoCount(tech, out message); if (message != null) { this.Warning(message); return; } } }); } private void CheckBox_Changed(object sender, System.Windows.RoutedEventArgs e) { var children = customPanel.Children; string message; foreach (var child in children) { PriceCounter counter = child as PriceCounter; counter.DoCount(tech, out message); if (message != null) { this.Warning(message); return; } } } } }