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
|
{
|
/// <summary>
|
/// MaterialOpt.xaml 的交互逻辑
|
/// </summary>
|
[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<string> 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<string>();
|
}
|
else
|
{
|
WorkstationSource = new ObservableCollection<string>(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();
|
}
|
}
|
}
|
}
|