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;
|
using Newtonsoft.Json.Linq;
|
using Plugin.ChangeModel.Entity;
|
using System.Collections.ObjectModel;
|
using System.Data;
|
using System.IO;
|
using System.Windows;
|
using System.Windows.Controls;
|
|
namespace Plugin.ChangeModel
|
{
|
/// <summary>
|
/// ChangeModel.xaml 的交互逻辑
|
/// </summary>
|
[ObservableObject]
|
public partial class ChangeModel : SimpleMaskControl
|
{
|
public ChangeModel()
|
{
|
api = new LSMSApi();
|
DataContext = this;
|
InitializeComponent();
|
}
|
|
[ObservableProperty]
|
private ObservableCollection<CmLogData> datasource;
|
|
[ObservableProperty]
|
private ObservableCollection<string> lineNameSource;
|
|
[ObservableProperty]
|
private ObservableCollection<string> workorderSource;
|
|
[ObservableProperty]
|
private ObservableCollection<string> productModelSource;
|
|
[ObservableProperty]
|
private string currentLineName;
|
[ObservableProperty]
|
private string currentWorkorder;
|
[ObservableProperty]
|
private string currentProductModel;
|
[ObservableProperty]
|
private Visibility workOrderVisiable = Visibility.Collapsed;
|
|
private string configLineName;
|
private string mesIp;
|
private int mesPort;
|
private LSMSApi api;
|
private bool isMesConnected = false;
|
private SqliteHelper sqliteHelper;
|
|
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));
|
}
|
}
|
|
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("ChangeModelByWorkOrder");
|
var res = bool.Parse(parameter.Value);
|
if (res) WorkOrderVisiable = Visibility.Visible;
|
}
|
catch
|
{
|
WorkOrderVisiable = Visibility.Collapsed;
|
}
|
|
try
|
{
|
var dbPath = Path.Combine(BaseFolder, "ChangeModel.db");
|
if (!File.Exists(dbPath))
|
{
|
SqliteHelper.CreateDatabase(dbPath);
|
}
|
sqliteHelper = new SqliteHelper(dbPath);
|
sqliteHelper.ExecuteSql(@"CREATE TABLE IF NOT EXISTS change_model_record (
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
lineName TEXT NOT NULL,
|
workOrder TEXT,
|
productModel TEXT NOT NULL,
|
customProperty TEXT,
|
changeTime TIME,
|
changeResult TEXT,
|
info TEXT);");
|
}
|
catch (Exception ex)
|
{
|
log.Error("Init ChangeModel DB Failed.", ex);
|
}
|
}
|
|
public override void Active()
|
{
|
base.Active();
|
if (!isMesConnected)
|
{
|
ConnectMes();
|
RefreshLineNameSource();
|
}
|
}
|
|
public override void DoClose(object sender, EventArgs e)
|
{
|
try
|
{
|
sqliteHelper?.Dispose();
|
string errMsg = string.Empty;
|
api?.DisConnect(ref errMsg);
|
base.DoClose(sender, e);
|
}
|
catch {
|
}
|
}
|
|
private void RefreshLineNameSource()
|
{
|
try
|
{
|
if (PingMes(out string errMsg))
|
{
|
string lineStr = api.GetAllLine();
|
JObject job = (JObject)JsonConvert.DeserializeObject(lineStr);
|
LineNameSource = new ObservableCollection<string>(job["ProductLines"].ToString().Split(','));
|
try
|
{
|
var parameter = ParameterManager.GetCommonParameterByName("LineName");
|
configLineName = parameter.Value;
|
CurrentLineName = parameter.Value;
|
}
|
catch
|
{
|
|
}
|
}
|
else
|
{
|
throw new Exception(errMsg);
|
}
|
}
|
catch (Exception ex)
|
{
|
log.Error("RefreshLineNameSource Failed.", ex);
|
MsgBoxHelper.ErrorMessage(Window.GetWindow(this), this.lang("cm.rfhLineNameFail", ex.Message));
|
}
|
}
|
|
private void RefreshWorkOrderByLineName(string lineName)
|
{
|
try
|
{
|
if (PingMes(out string errMsg))
|
{
|
string workOrderStr = api.GetWorkOrderByLineName(lineName, out errMsg);
|
if (string.IsNullOrEmpty(errMsg))
|
{
|
JObject res = (JObject)JsonConvert.DeserializeObject(workOrderStr);
|
JArray workOrders = (JArray)res["Data"];
|
WorkorderSource = new ObservableCollection<string>(workOrders.Select(j => j["Code"].ToString()).ToArray());
|
}
|
|
string infoStr = api.GetProductInfoByLineName(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.FFF"), lineName, out errMsg);
|
if (string.IsNullOrEmpty(errMsg))
|
{
|
JObject job = JsonConvert.DeserializeObject(infoStr) as JObject;
|
CurrentWorkorder = job["Order"]?.ToString();
|
}
|
}
|
else
|
{
|
throw new Exception(errMsg);
|
}
|
}
|
catch (Exception ex)
|
{
|
log.Error("RefreshWorkOrderByLineName Failed.", ex);
|
MsgBoxHelper.ErrorMessage(Window.GetWindow(this), this.lang("cm.rfhWorkOrderFail", ex.Message));
|
}
|
}
|
|
private void RefreshProductByLineName(string lineName)
|
{
|
try
|
{
|
if (PingMes(out string errMsg))
|
{
|
string workOrderStr = api.GetProductsByLineName(lineName, out string ErrMsg);
|
if (string.IsNullOrEmpty(errMsg))
|
{
|
JObject res = (JObject)JsonConvert.DeserializeObject(workOrderStr);
|
JArray arr = res["Products"] as JArray;
|
ProductModelSource = new ObservableCollection<string>(arr.Select(j => j["model"].ToString()).ToArray());
|
}
|
|
string lineStr = api.GetProductInfoByLineName(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.FFF"), lineName, out errMsg);
|
if (string.IsNullOrEmpty(errMsg))
|
{
|
JObject job = (JObject)JsonConvert.DeserializeObject(lineStr);
|
CurrentProductModel = job["Model"]?.ToString();
|
}
|
}
|
else
|
{
|
throw new Exception(errMsg);
|
}
|
}
|
catch (Exception ex)
|
{
|
log.Error("RefreshProductByLineName Failed.", ex);
|
MsgBoxHelper.ErrorMessage(Window.GetWindow(this), this.lang("cm.rfhModelFail", ex.Message));
|
}
|
}
|
|
private void MesChangeModel()
|
{
|
ShowMask(() =>
|
{
|
if (PingMes(out string errMsg))
|
{
|
var info = new Dictionary<string, object>() {
|
{ "Model",CurrentProductModel}
|
};
|
if (WorkOrderVisiable == Visibility.Visible)
|
{
|
info["Order"] = CurrentWorkorder;
|
}
|
if (!api.ChangeModel2(CurrentLineName, info, out errMsg))
|
{
|
throw new Exception(errMsg);
|
}
|
sqliteHelper.ExecuteSql($@"INSERT INTO change_model_record (lineName, workOrder,productModel, customProperty,
|
changeTime,changeResult,info) Values
|
('{CurrentLineName}','{CurrentWorkorder}','{CurrentProductModel}',NULL,'{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.FFF")}', 'OK', NULL)");
|
RefreshLog();
|
if (!api.RefreshCache(out errMsg))
|
{
|
throw new Exception($"Refresh MES Cache Failed.: {errMsg}");
|
}
|
ToastHelper.Success("换型成功");
|
}
|
else
|
{
|
throw new Exception(errMsg);
|
}
|
},
|
(ex) =>
|
{
|
log.Error("MesChangeModel Failed.", ex);
|
MsgBoxHelper.ErrorMessage(Window.GetWindow(this), this.lang("cm.changeFail", 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 RefreshLog()
|
{
|
try
|
{
|
DataTable dt = sqliteHelper.GetDataTable(@"SELECT lineName AS LineName
|
,productModel AS ProductModel
|
,customProperty AS CustomProperty
|
,changeTime AS ChangeTime
|
,changeResult AS ChangeResult
|
,info AS Info
|
FROM change_model_record order by changeTime desc limit 100;");
|
this.Dispatcher.BeginInvoke((Action)delegate ()
|
{
|
table.ItemsSource = dt.DefaultView;
|
});
|
}
|
catch (Exception ex)
|
{
|
log.Error("Refresh ChangeModel Log Failed.", ex);
|
ToastHelper.Error(this.lang("cm.rfhLogFail", ex.Message));
|
}
|
}
|
|
partial void OnCurrentLineNameChanged(string lineName)
|
{
|
RefreshWorkOrderByLineName(lineName);
|
RefreshProductByLineName(lineName);
|
}
|
|
|
private void Button_Click(object sender, RoutedEventArgs e)
|
{
|
switch ((sender as Button).Name)
|
{
|
case "changeModelBtn":
|
DoChangeModel();
|
break;
|
case "refreshLogBtn":
|
ShowMask(RefreshLog, null, "请稍后", "正在刷新...");
|
break;
|
case "refreshInfoBtn":
|
RefreshInfo();
|
break;
|
case "deleteLogBtn":
|
DeleteLog();
|
break;
|
default:
|
break;
|
}
|
}
|
|
private void DeleteLog()
|
{
|
if (MsgBoxHelper.WarnMessage(this, this.lang("cm.makeSureDelLog")) != MessageBoxResult.OK)
|
{
|
return;
|
}
|
ShowMask(() =>
|
{
|
try
|
{
|
sqliteHelper.ExecuteSql($@"DELETE FROM change_model_record WHERE ID NOT IN
|
(SELECT id FROM change_model_record Order by changeTime DESC limit 10);");
|
RefreshLog();
|
}
|
catch (Exception ex)
|
{
|
log.Error("DeleteLog Failed.", ex);
|
ToastHelper.Error(this.lang("cm.delLogFail", ex.Message));
|
}
|
}, null, "请稍后", "正在清理...");
|
}
|
|
private void RefreshInfo()
|
{
|
try
|
{
|
RefreshLineNameSource();
|
RefreshWorkOrderByLineName(CurrentLineName);
|
RefreshProductByLineName(CurrentLineName);
|
}
|
catch (Exception ex)
|
{
|
log.Error("Refresh Info Failed.", ex);
|
ToastHelper.Error(this.lang("cm.rfhInfoErr", ex.Message));
|
}
|
}
|
|
private void DoChangeModel()
|
{
|
if (string.IsNullOrEmpty(CurrentLineName) || string.IsNullOrEmpty(CurrentProductModel)) return;
|
if (MsgBoxHelper.WarnMessage(this, this.lang("cm.makeSureChangeModel")) != MessageBoxResult.OK)
|
{
|
return;
|
}
|
MesChangeModel();
|
}
|
|
private void SimpleControl_Loaded(object sender, RoutedEventArgs e)
|
{
|
RefreshLog();
|
}
|
}
|
}
|