using CommunityToolkit.Mvvm.ComponentModel; using HMI.Base; using HMI.Core.Entity; using HMI.Core.Manager; using HMI.Core.Util; using HMI.UI.Util; using LSMSInterface; using Newtonsoft.Json.Linq; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web.SessionState; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Data; using System.Windows.Media.Media3D; namespace Plugin.MaterialOpt { /// /// MaterialOpt.xaml 的交互逻辑 /// [ObservableObject] public partial class MaterialOpt : SimpleControl { public MaterialOpt() { DataContext = this; api = new LSMSApi(); InitializeComponent(); } [ObservableProperty] private string currentProductSN; [ObservableProperty] private string currentMaterialSN; [ObservableProperty] private string currentMaterialName; [ObservableProperty] private string currentWorkstation; [ObservableProperty] private ObservableCollection workstationSource; private string lineName; private string mesIp; private int mesPort; private LSMSApi api; private bool isMesConnected = false; private SqliteHelper sqliteHelper; public override void InitFinish() { base.InitFinish(); ParameterData parameter; try { parameter = ParameterManager.GetCommonParameterByName("MesIp"); mesIp = parameter.Value; } catch { mesIp = "127.0.0.1"; } try { parameter = ParameterManager.GetCommonParameterByName("MesPort"); mesPort = int.Parse(parameter.Value); } catch { mesPort = 9909; } try { parameter = ParameterManager.GetCommonParameterByName("LineName"); lineName = parameter.Value; } catch { lineName = string.Empty; } //try //{ // parameter = ParameterManager.GetCommonParameterByName("ChangeModelByWorkOrder"); // var res = bool.Parse(parameter.Value); // if (res) WorkOrderVisiable = Visibility.Visible; //} //catch //{ // WorkOrderVisiable = Visibility.Collapsed; //} try { var dbPath = Path.Combine(BaseFolder, "MaterialOpt.db"); if (!File.Exists(dbPath)) { SqliteHelper.CreateDatabase(dbPath); } sqliteHelper = new SqliteHelper(dbPath); sqliteHelper.ExecuteSql(@"CREATE TABLE IF NOT EXISTS bind_record ( id INTEGER PRIMARY KEY AUTOINCREMENT, ProductSN TEXT NOT NULL, MaterialSN TEXT NOT NULL, MaterialName TEXT , Workstation TEXT , Time TIME);"); sqliteHelper.ExecuteSql(@"CREATE TABLE IF NOT EXISTS unbind_record ( id INTEGER PRIMARY KEY AUTOINCREMENT, ProductSN TEXT NOT NULL, MaterialSN TEXT NOT NULL, MaterialName TEXT , Workstation TEXT , Time TIME);"); } catch (Exception ex) { log.Error("Init MaterialOpt DB Failed.", ex); } } public override void Active() { base.Active(); //if (!isMesConnected) //{ // ConnectMes(); // RefreshWorkstationSource(); //} } public void ConnectMes() { string msg = string.Empty; try { if (api.Connect(this.mesIp, this.mesPort, ref msg)) { isMesConnected = true; } else { throw new Exception(msg); } } catch (Exception ex) { isMesConnected = false; log.Error("ConnectMes Failed.", ex); MsgBoxHelper.Error(Window.GetWindow(this), this.lang("cm.mesConnectFail", ex.Message)); } } private bool PingMes(out string errMsg) { errMsg = string.Empty; if (!isMesConnected) { errMsg = "MES未连接,请先连接MES"; return false; } try { if (!api.IsConnect(ref errMsg)) { isMesConnected = false; return false; } return true; } catch (Exception ex) { errMsg = ex.Message; isMesConnected = false; return false; } } private void RefreshWorkstationSource() { string errMsg = string.Empty; try { if (api.Connect(mesIp, mesPort, ref errMsg)) { string lineStr = api.GetAllStationByCurrentLine(lineName, out errMsg); JObject res = (JObject)JsonConvert.DeserializeObject(lineStr); string stations = res["WorkStations"]?.ToString(); if (string.IsNullOrEmpty(stations)) { WorkstationSource = new ObservableCollection(); } else { WorkstationSource = new ObservableCollection(stations.Split(',')); } } else { MsgBoxHelper.ErrorMessage(this, $"连接服务器失败: {errMsg}"); } } catch (Exception ex) { MsgBoxHelper.ErrorMessage(this, $"绑定失败: {errMsg}"); } finally { api.DisConnect(ref errMsg); } } private void Button_Click(object sender, RoutedEventArgs e) { var btn = sender as Button; switch (btn.Name) { case "bindBtn": BindMaterial(); break; case "bindQryBtn": mask.ShowMask(this, RefreshBindLog, null, "请稍后", "正在查询..."); break; case "unbindBtn": UnBindMaterial(); break; case "unbindQryBtn": mask.ShowMask(this, RefreshUnBindLog, null, "请稍后", "正在查询..."); break; //case "rowUnBindBtn": // UnBindMaterial(data.ItemArray[1].ToString(), data.ItemArray[2].ToString()); // break; //case "rowReBindBtn": // BindMaterial(); break; default: break; } } private void BindMaterial() { if (string.IsNullOrEmpty(CurrentProductSN)) { ToastHelper.Warning("请输入产品序列号"); return; } if (string.IsNullOrEmpty(CurrentMaterialSN)) { ToastHelper.Warning("请输入物料条码"); return; } //if (string.IsNullOrEmpty(CurrentMaterialName)) //{ // ToastHelper.Warning("请输入物料名称"); // return; //} if (string.IsNullOrEmpty(CurrentWorkstation)) { ToastHelper.Warning("请选择工站"); return; } if (MsgBoxHelper.WarnMessage(this, "确定绑定该物料吗?") != MessageBoxResult.OK) { return; } mask.ShowMask(this, () => { string errMsg = string.Empty; try { if (!api.Connect(mesIp, mesPort, ref errMsg)) { throw new Exception($"连接服务器失败: {errMsg}"); } string text2 = api.CheckBoolMaterial_2163(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.FFF"), CurrentProductSN, CurrentWorkstation, CurrentMaterialName, CurrentMaterialSN, out errMsg); if (!string.IsNullOrEmpty(errMsg)) { throw new Exception(errMsg); } sqliteHelper.ExecuteSql($@"INSERT INTO bind_record (ProductSN, MaterialSN, Workstation, Time) Values ('{CurrentProductSN}', '{CurrentMaterialSN}', '{CurrentWorkstation}','{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.FFF")}')"); ToastHelper.Success("绑定成功"); RefreshBindLog(); } finally { api.DisConnect(ref errMsg); } }, (ex) => { Dispatcher.BeginInvoke(new Action(() => { MsgBoxHelper.Error(this, $"绑定失败: {ex.Message}"); })); }, "请稍后", "正在绑定..."); } private void UnBindMaterial(string productSN = null, string materialSN = null) { if (productSN == null) { productSN = CurrentProductSN; } if (materialSN == null) { materialSN = CurrentMaterialSN; } if (string.IsNullOrEmpty(productSN)) { ToastHelper.Warning("请输入产品序列号"); return; } if (string.IsNullOrEmpty(materialSN)) { ToastHelper.Warning("请输入物料条码"); return; } if (MsgBoxHelper.WarnMessage(this, "确定解绑该物料吗?") != MessageBoxResult.OK) { return; } mask.ShowMask(this, () => { string errMsg = string.Empty; try { if (!api.Connect(mesIp, mesPort, ref errMsg)) { throw new Exception($"连接服务器失败: {errMsg}"); } string text2 = api.UnBookMaterial(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.FFF"), productSN, materialSN, out errMsg); if (!string.IsNullOrEmpty(errMsg)) { throw new Exception(errMsg); } sqliteHelper.ExecuteSql($@"INSERT INTO unbind_record (ProductSN, MaterialSN, Workstation, Time) Values ('{productSN}', '{materialSN}', '', '{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.FFF")}')"); ToastHelper.Success("解绑成功"); RefreshUnBindLog(); } finally { api.DisConnect(ref errMsg); } }, (ex) => { Dispatcher.BeginInvoke(new Action(() => { MsgBoxHelper.Error(this, $"解绑失败: {ex.Message}"); })); }, "请稍后", "正在解绑..."); } private void RefreshBindLog() { var dt = sqliteHelper.GetDataTable("SELECT * FROM bind_record ORDER BY Time DESC LIMIT 100"); this.Dispatcher.BeginInvoke(new Action(() => { table.ItemsSource = dt.DefaultView; })); } private void RefreshUnBindLog() { var dt = sqliteHelper.GetDataTable("SELECT * FROM unbind_record ORDER BY Time DESC LIMIT 100"); this.Dispatcher.BeginInvoke(new Action(() => { unbindTable.ItemsSource = dt.DefaultView; })); } private void SimpleControl_Loaded(object sender, RoutedEventArgs e) { RefreshWorkstationSource(); RefreshBindLog(); RefreshUnBindLog(); //try //{ // ConnectMes(); // RefreshWorkstationSource(); //} //catch (Exception ex) //{ // log.Error("MaterialOpt Load Failed.", ex); //} } private void table_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (e.AddedItems == null || e.AddedItems.Count <= 0) { return; } var data = (e.AddedItems[0] as DataRowView).Row; if (sender == table) { CurrentProductSN = data.ItemArray[1].ToString(); CurrentMaterialSN = data.ItemArray[2].ToString(); CurrentWorkstation = data.ItemArray[4].ToString(); } else if (sender == unbindTable) { CurrentProductSN = data.ItemArray[1].ToString(); CurrentMaterialSN = data.ItemArray[2].ToString(); } } } }