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