2023-03-24 09:58:42 +08:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.ComponentModel;
|
|
|
|
|
using System.Data;
|
|
|
|
|
using System.Drawing;
|
|
|
|
|
using System.IO;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Threading;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using System.Windows.Forms;
|
|
|
|
|
using WeifenLuo.WinFormsUI.Docking;
|
|
|
|
|
using XKRS.Common.Factory;
|
|
|
|
|
using XKRS.Common.Interface;
|
|
|
|
|
using XKRS.Common.Model.Helper;
|
|
|
|
|
using XKRS.UI.Model.Winform;
|
2023-03-24 17:02:04 +08:00
|
|
|
|
using XKRS.UI.Model.Winform.Helper;
|
2023-03-24 09:58:42 +08:00
|
|
|
|
|
|
|
|
|
namespace XKRS.UI.Main
|
|
|
|
|
{
|
|
|
|
|
public partial class MainFrm : Form
|
|
|
|
|
{
|
|
|
|
|
IProcess _process = null;
|
|
|
|
|
System.Diagnostics.Process process = new System.Diagnostics.Process();
|
|
|
|
|
System.Diagnostics.Process processB = new System.Diagnostics.Process();
|
|
|
|
|
System.Diagnostics.Process processC = new System.Diagnostics.Process();
|
|
|
|
|
public MainFrm()
|
|
|
|
|
{
|
|
|
|
|
InitializeComponent();
|
|
|
|
|
System.Diagnostics.Process.GetCurrentProcess().PriorityClass = System.Diagnostics.ProcessPriorityClass.RealTime;
|
|
|
|
|
var theme = new VS2015LightTheme();
|
|
|
|
|
stsStripLayout.BackColor = ststripDevices.BackColor = Color.FromArgb(64, 64, 64);
|
|
|
|
|
dockPanelMain.Theme = theme;
|
|
|
|
|
VisualStudioToolStripExtender extender = new VisualStudioToolStripExtender();
|
|
|
|
|
extender.SetStyle(menuMain, VisualStudioToolStripExtender.VsVersion.Vs2015, theme);
|
2023-03-24 17:02:04 +08:00
|
|
|
|
InitialMenu(MenuFormFactory.MenuFrmTypeDict, "");
|
|
|
|
|
|
|
|
|
|
m_deserializeMenuFrm = new DeserializeDockContent(GetMenuFromPersistString);
|
|
|
|
|
m_deserializeDeviceRunFrm = new DeserializeDockContent(GetAllFormPersistString);
|
|
|
|
|
|
|
|
|
|
notifyIcon.Text = SettingHelper.GetProgramDescription();
|
|
|
|
|
string iconPath = SettingHelper.GetProgramIcon();
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(iconPath))
|
|
|
|
|
{
|
|
|
|
|
notifyIcon.Icon = Icon = new Icon(iconPath);
|
|
|
|
|
}
|
2023-03-24 09:58:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-03-24 17:02:04 +08:00
|
|
|
|
private void RegisterEvent(MenuFormBase dockFrm)
|
|
|
|
|
{
|
|
|
|
|
dockFrm.OnUploadProcess = DockFrm_OnUploadProcess;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#region Menu
|
2023-03-24 09:58:42 +08:00
|
|
|
|
readonly ManualResetEvent _allMenuLoadDoneHandle = new ManualResetEvent(false);
|
|
|
|
|
|
2023-03-24 17:02:04 +08:00
|
|
|
|
private void InitialMenu(Dictionary<MenuNodeAttribute, Type> menuFrmTypeDict, string parentMenuCode)
|
|
|
|
|
{
|
|
|
|
|
menuFrmTypeDict.Keys.Where(u => u.ParentMenuCode == parentMenuCode).OrderBy(m => m.MenuOrder).ToList().ForEach(m =>
|
|
|
|
|
{
|
|
|
|
|
ToolStripMenuItem item = new ToolStripMenuItem(m.MenuName);
|
|
|
|
|
item.Tag = m.MenuCode;
|
|
|
|
|
if (m.IsActualForm)
|
|
|
|
|
{
|
|
|
|
|
item.Click += MenuFormItem_Click;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private async void DockFrm_OnUploadProcess(string frmId, IProcess process)
|
|
|
|
|
{
|
|
|
|
|
await Task.Run(() =>
|
|
|
|
|
{
|
|
|
|
|
_allMenuLoadDoneHandle.WaitOne();//阻止当前线程,直到WaitHandle接收到信号
|
|
|
|
|
this.Invoke(new Action(() =>
|
|
|
|
|
{
|
|
|
|
|
_process = process;
|
|
|
|
|
|
2023-03-24 09:58:42 +08:00
|
|
|
|
|
2023-03-24 17:02:04 +08:00
|
|
|
|
CloseAllDeviceFrm();
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
foreach (var dock in dockPanelMain.Contents)
|
|
|
|
|
{
|
|
|
|
|
MenuFormBase m = dock as MenuFormBase;
|
|
|
|
|
if (m != null && m.Id != frmId)
|
|
|
|
|
{
|
|
|
|
|
m.DownloadProcess(process);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
throw ex;
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void MenuFormItem_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
SuspendLayout();
|
|
|
|
|
ToolStripMenuItem item = sender as ToolStripMenuItem;
|
|
|
|
|
bool isExisted = false;
|
|
|
|
|
foreach (var dock in dockPanelMain.Contents)
|
|
|
|
|
{
|
|
|
|
|
MenuFormBase menu = dock as MenuFormBase;
|
|
|
|
|
if (menu != null && menu.Tag.ToString() == item.Tag.ToString())
|
|
|
|
|
{
|
|
|
|
|
if (menu.IsHidden)
|
|
|
|
|
{
|
|
|
|
|
menu.Show();
|
|
|
|
|
}
|
|
|
|
|
menu.BringToFront();
|
|
|
|
|
isExisted = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (isExisted)
|
|
|
|
|
{
|
|
|
|
|
ResumeLayout();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
MenuFormBase dockFrm = MenuFormFactory.GetMenuFrm(item.Tag.ToString());
|
|
|
|
|
if (dockFrm == null)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
dockFrm.Text = item.Text;
|
|
|
|
|
|
|
|
|
|
dockFrm.DockPanel = dockPanelMain;
|
|
|
|
|
dockFrm.SetLoginStatus(IsLogin);
|
|
|
|
|
dockFrm.DockStateChanged += DockStateChanged;
|
|
|
|
|
dockFrm.Show();
|
|
|
|
|
|
|
|
|
|
RegisterEvent(dockFrm);
|
|
|
|
|
ResumeLayout();
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
2023-03-24 09:58:42 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void MainFrm_Load(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
LoadLayoutFromXML(m_deserializeMenuFrm);
|
|
|
|
|
_allMenuLoadDoneHandle.Set();
|
|
|
|
|
|
|
|
|
|
AdvancedPwdFrm.OnLoginOK = OnLoginOK;
|
|
|
|
|
|
|
|
|
|
LoadProcess();
|
|
|
|
|
LoadLayoutFromXML(m_deserializeDeviceRunFrm);
|
|
|
|
|
LoadProcess(false);
|
|
|
|
|
Openexe();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void Openexe()
|
|
|
|
|
{
|
|
|
|
|
string strPathExe = Environment.CurrentDirectory + "\\BDebug2022110201_5" + "\\NJJ-ZK.exe";
|
|
|
|
|
process.StartInfo.WorkingDirectory = Environment.CurrentDirectory + "\\BDebug2022110201_5";
|
|
|
|
|
process.StartInfo.FileName = strPathExe;
|
|
|
|
|
process.StartInfo.Arguments = null;//-s -t 可以用来关机或重启
|
|
|
|
|
process.StartInfo.UseShellExecute = false;
|
|
|
|
|
process.StartInfo.RedirectStandardInput = false;//true
|
|
|
|
|
process.StartInfo.RedirectStandardOutput = false;
|
|
|
|
|
process.StartInfo.RedirectStandardError = false;
|
|
|
|
|
process.StartInfo.CreateNoWindow = false;
|
|
|
|
|
process.Start();//启动
|
|
|
|
|
|
|
|
|
|
string strPathExe2 = Environment.CurrentDirectory + "\\CDebug2022110201_4" + "\\NJJ-ZK.exe";
|
|
|
|
|
processB.StartInfo.WorkingDirectory = Environment.CurrentDirectory + "\\CDebug2022110201_4";
|
|
|
|
|
processB.StartInfo.FileName = strPathExe2;
|
|
|
|
|
processB.StartInfo.Arguments = null;//-s -t 可以用来关机、开机或重启
|
|
|
|
|
processB.StartInfo.UseShellExecute = false;
|
|
|
|
|
processB.StartInfo.RedirectStandardInput = false; //true
|
|
|
|
|
processB.StartInfo.RedirectStandardOutput = false; //true
|
|
|
|
|
processB.StartInfo.RedirectStandardError = false;
|
|
|
|
|
processB.StartInfo.CreateNoWindow = false;
|
|
|
|
|
processB.Start();//启动
|
|
|
|
|
|
|
|
|
|
string strPathExe3 = Environment.CurrentDirectory + "\\ADebug2022110201_2" + "\\NJJ-ZK.exe";
|
|
|
|
|
processC.StartInfo.WorkingDirectory = Environment.CurrentDirectory + "\\ADebug2022110201_2";
|
|
|
|
|
processC.StartInfo.FileName = strPathExe3;
|
|
|
|
|
processC.StartInfo.Arguments = null;//-s -t 可以用来关机、开机或重启
|
|
|
|
|
processC.StartInfo.UseShellExecute = false;
|
|
|
|
|
processC.StartInfo.RedirectStandardInput = false; //true
|
|
|
|
|
processC.StartInfo.RedirectStandardOutput = false; //true
|
|
|
|
|
processC.StartInfo.RedirectStandardError = false;
|
|
|
|
|
processC.StartInfo.CreateNoWindow = false;
|
|
|
|
|
processC.Start();//启动
|
|
|
|
|
}
|
|
|
|
|
private void Killexe()
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
process.CloseMainWindow();//通过向进程的主窗口发送关闭消息来关闭拥有用户界面的进程
|
|
|
|
|
process.Close();//释放与此组件关联的所有资源
|
|
|
|
|
processB.CloseMainWindow();//通过向进程的主窗口发送关闭消息来关闭拥有用户界面的进程
|
|
|
|
|
processB.Close();//释放与此组件关联的所有资源
|
|
|
|
|
processC.CloseMainWindow();//通过向进程的主窗口发送关闭消息来关闭拥有用户界面的进程
|
|
|
|
|
processC.Close();//释放与此组件关联的所有资源
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private List<string> LoadProcessCode()
|
|
|
|
|
{
|
|
|
|
|
var systemProcessCodes = ProcessFactory.GetProcessCodes();
|
|
|
|
|
var avaiableProcessCodes = SettingHelper.GetProcessCodes();
|
|
|
|
|
List<string> pCodes = new List<string>();
|
|
|
|
|
if (avaiableProcessCodes.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
pCodes = avaiableProcessCodes.Intersect(systemProcessCodes).ToList();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
pCodes = systemProcessCodes;
|
|
|
|
|
}
|
|
|
|
|
if (pCodes.Count > 1)
|
|
|
|
|
{
|
|
|
|
|
pCodes.RemoveAll(u => u == "");
|
|
|
|
|
}
|
|
|
|
|
return pCodes;
|
|
|
|
|
}
|
|
|
|
|
private List<string> LoadProductionCode()
|
|
|
|
|
{
|
|
|
|
|
return SettingHelper.GetProductionCodes();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 载入流程
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="isInitialProcess">是否为初始化流程</param>
|
|
|
|
|
private void LoadProcess(bool isInitialProcess = true)
|
|
|
|
|
{
|
2023-03-24 17:02:04 +08:00
|
|
|
|
if (isInitialProcess)//初次创建流程
|
2023-03-24 09:58:42 +08:00
|
|
|
|
{
|
|
|
|
|
var processCodes = LoadProcessCode();
|
|
|
|
|
var productionCodes = LoadProductionCode();
|
|
|
|
|
_process = ProcessFactory.CreateStationProcess(processCodes[0], productionCodes[0], out string msg);
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(msg))
|
|
|
|
|
{
|
|
|
|
|
_process = null;
|
|
|
|
|
|
|
|
|
|
throw new ProcessException($"创建失败,{msg}", null, ExceptionLevel.Fatal);
|
|
|
|
|
}
|
|
|
|
|
_process.InitialProcess("");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#region Login
|
|
|
|
|
bool isLogin = false;
|
|
|
|
|
bool IsLogin
|
|
|
|
|
{
|
|
|
|
|
get => isLogin;
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
isLogin = value;
|
|
|
|
|
tsslLoginStatus.Text = isLogin ? "已登录" : "未登录";
|
2023-03-24 17:02:04 +08:00
|
|
|
|
foreach (var dock in dockPanelMain.Contents)
|
2023-03-24 09:58:42 +08:00
|
|
|
|
{
|
2023-03-24 17:02:04 +08:00
|
|
|
|
var menuFrm = dock as MenuFormBase;
|
2023-03-24 09:58:42 +08:00
|
|
|
|
if (menuFrm != null)
|
|
|
|
|
{
|
|
|
|
|
menuFrm.SetLoginStatus(isLogin);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OnLoginOK(bool isLogin)
|
|
|
|
|
{
|
|
|
|
|
IsLogin = isLogin;
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region CloseForm
|
2023-03-24 17:02:04 +08:00
|
|
|
|
private void DeviceDisplayFrm_FormClosed(object sender, FormClosedEventArgs e)
|
2023-03-24 09:58:42 +08:00
|
|
|
|
{
|
|
|
|
|
string id = (sender as DeviceRunFrmBase).Device.Id;
|
2023-03-24 17:02:04 +08:00
|
|
|
|
if (showedDeviceUIDict.ContainsKey(id))
|
2023-03-24 09:58:42 +08:00
|
|
|
|
{
|
|
|
|
|
showedDeviceUIDict.Remove(id);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void CloseAllDeviceFrm()
|
|
|
|
|
{
|
|
|
|
|
this.Invoke(new Action(() =>
|
|
|
|
|
{
|
|
|
|
|
this.SuspendLayout();
|
|
|
|
|
dockPanelMain.Contents.Select(u =>
|
|
|
|
|
{
|
|
|
|
|
if (u is DeviceRunFrmBase runFrmBase)
|
|
|
|
|
{
|
|
|
|
|
return runFrmBase;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}).ToList().ForEach(u =>
|
|
|
|
|
{
|
|
|
|
|
if (u == null)
|
|
|
|
|
return;
|
|
|
|
|
if (_process.DeviceCollection.Any(d => d.Id == u.Device.Id))
|
|
|
|
|
return;
|
|
|
|
|
u.DockPanel = null;
|
|
|
|
|
u.Close();
|
|
|
|
|
});
|
|
|
|
|
this.ResumeLayout();
|
|
|
|
|
}));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
2023-03-24 17:02:04 +08:00
|
|
|
|
#region Layout布局
|
|
|
|
|
|
|
|
|
|
string _layoutFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"{SettingHelper.GetSelectLayout()}.layout");//路径
|
|
|
|
|
private DeserializeDockContent m_deserializeMenuFrm;
|
|
|
|
|
private DeserializeDockContent m_deserializeDeviceRunFrm;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private IDockContent GetMenuFromPersistString(string persistString)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
private IDockContent GetAllFormPersistString(string persistString)
|
|
|
|
|
{
|
|
|
|
|
if (persistString.StartsWith("MenuFrm"))
|
|
|
|
|
{
|
|
|
|
|
var desc = persistString.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
|
|
|
|
|
string menuCode = desc[1];
|
|
|
|
|
foreach(var dock in dockPanelMain.Contents)
|
|
|
|
|
{
|
|
|
|
|
MenuFormBase menu = dock as MenuFormBase;
|
|
|
|
|
if (menu != null && menu.Tag.ToString() == menuCode)
|
|
|
|
|
{
|
|
|
|
|
return dock;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
MenuFormBase dockFrm = MenuFormFactory.GetMenuFrm(menuCode);
|
|
|
|
|
if (dockFrm == null)
|
|
|
|
|
{
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
dockFrm.Text = desc[2];
|
|
|
|
|
dockFrm.DockStateChanged += DockStateChanged;
|
|
|
|
|
dockFrm.SetLoginStatus(IsLogin);
|
|
|
|
|
RegisterEvent(dockFrm);
|
|
|
|
|
return dockFrm;
|
|
|
|
|
}
|
|
|
|
|
if (persistString.StartsWith("DeviceRunFrm"))
|
|
|
|
|
{
|
|
|
|
|
string deviceId = persistString.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)[1];
|
|
|
|
|
var device = _process.DeviceCollection.FirstOrDefault(u => u.Id == deviceId);
|
|
|
|
|
if (null == device || null == deviceId)
|
|
|
|
|
{
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
if (!showedDeviceUIDict.ContainsKey(deviceId))
|
|
|
|
|
{
|
|
|
|
|
var runCtrl = UIFactory.GetRunCtrl(device);
|
|
|
|
|
DeviceRunFrmBase runFrm = new DeviceRunFrmBase(device, runCtrl);
|
|
|
|
|
runFrm.Text = device.Name;
|
|
|
|
|
runFrm.MdiParent = this;
|
|
|
|
|
runFrm.DockPanel = dockPanelMain;
|
|
|
|
|
runFrm.DockState = DockState.Document;
|
|
|
|
|
runFrm.FormClosed += DeviceDisplayFrm_FormClosed;
|
|
|
|
|
runFrm.DockStateChanged += DockStateChanged;
|
|
|
|
|
showedDeviceUIDict[deviceId] = runFrm;
|
|
|
|
|
}
|
|
|
|
|
return showedDeviceUIDict[deviceId];
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void DockStateChanged(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if (sender is DockContent dc)
|
|
|
|
|
{
|
|
|
|
|
if (dc.DockState == DockState.Float)
|
|
|
|
|
{
|
|
|
|
|
dc.Parent.FindForm().FormBorderStyle = FormBorderStyle.Sizable;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void LoadLayoutFromXML(DeserializeDockContent dContent)
|
|
|
|
|
{
|
|
|
|
|
if (!File.Exists(_layoutFile))
|
|
|
|
|
return;
|
|
|
|
|
dockPanelMain.SuspendLayout(true);//悬挂式布局
|
|
|
|
|
|
|
|
|
|
CloseAllDeviceFrm();
|
|
|
|
|
while (dockPanelMain.Contents.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
dockPanelMain.Contents[0].DockHandler.DockPanel = null;
|
|
|
|
|
}
|
|
|
|
|
using (FileStream stream = new FileStream(_layoutFile, FileMode.Open))
|
|
|
|
|
{
|
|
|
|
|
dockPanelMain.LoadFromXml(stream, dContent);
|
|
|
|
|
stream.Close();
|
|
|
|
|
}
|
|
|
|
|
dockPanelMain.ResumeLayout(true, true);
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-03-24 09:58:42 +08:00
|
|
|
|
#region Device Display 设备展示到底部状态栏
|
|
|
|
|
readonly Dictionary<string, DeviceRunFrmBase> showedDeviceUIDict = new Dictionary<string, DeviceRunFrmBase>();
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|