using DotNetSAPI;
using RGD.Common;
using RGD.DataService;
using RGD.DBUtility;
using RGD.ZhiQianAPI;
using RGD.MdsAPI;
using RGD.MdsAPI.WMS;
using System;
using System.Data;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Windows.Forms;
using System.Xml;
namespace RGD.WCS
{
public partial class FrmMain : Form
{
#region 窗体显示
[System.Runtime.InteropServices.DllImport("user32")]
private static extern bool AnimateWindow(IntPtr hwnd, int dwTime, int dwFlags);
private const int AW_HOR_POSITIVE = 0x0001;//自左向右显示窗口,该标志可以在滚动动画和滑动动画中使用。使用AW_CENTER标志时忽略该标志
private const int AW_HOR_NEGATIVE = 0x0002;//自右向左显示窗口,该标志可以在滚动动画和滑动动画中使用。使用AW_CENTER标志时忽略该标志
private const int AW_VER_POSITIVE = 0x0004;//自顶向下显示窗口,该标志可以在滚动动画和滑动动画中使用。使用AW_CENTER标志时忽略该标志
private const int AW_VER_NEGATIVE = 0x0008;//自下向上显示窗口,该标志可以在滚动动画和滑动动画中使用。使用AW_CENTER标志时忽略该标志该标志
private const int AW_CENTER = 0x0010;//若使用了AW_HIDE标志,则使窗口向内重叠;否则向外扩展
private const int AW_HIDE = 0x10000;//隐藏窗口
private const int AW_ACTIVE = 0x20000;//激活窗口,在使用了AW_HIDE标志后不要使用这个标志
private const int AW_SLIDE = 0x40000;//使用滑动类型动画效果,默认为滚动动画类型,当使用AW_CENTER标志时,这个标志就被忽略
private const int AW_BLEND = 0x80000;//使用淡入淡出效果
private static FrmMain _formInstance;
#endregion 窗体显示
private static Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
private static byte[] result = new byte[1024];
public static int taskId = 0;
public static int taskCount = 0;
public static FrmMain FormInstance
{
get
{
if (_formInstance == null)
{
_formInstance = new FrmMain();
}
return _formInstance;
}
set { _formInstance = value; }
}
private SpeechVoiceSpeakFlags SpFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync;
public SpVoice Voice = new SpVoice();
public FrmMain()
{
InitializeComponent();
_formInstance = this;
//黑匣子文件 文件清理
RGD.Common.CCarryConvert.NeatenDarkCasket();
#region 系统配置文件初始化
////路径搜索方式
//CStaticClass.RouteSearchMode = CommonClassLib.AppSettings.GetValue("RouteSearchMode");
////双叉关联任务允许等待的时间
//CStaticClass.DoubleForkWaitTime = CommonClassLib.AppSettings.GetValue("DoubleForkWaitTime");
////AGV是否允许单叉动作
//CStaticClass.AGVAllowSingleFork = CommonClassLib.AppSettings.GetValue("AGVAllowSingleFork");
////日志黑匣子保存时间
//CStaticClass.SaveDays = CommonClassLib.AppSettings.GetValue("SaveDays");
////移动设备是否被提前触发将取
//CStaticClass.MovedDeviceAheadTrigger = CommonClassLib.AppSettings.GetValue("MovedDeviceAheadTrigger");
////堆垛机出库是否检测目标输送机空闲和有物
//CStaticClass.OutDetectArrowIdleGoods = CommonClassLib.AppSettings.GetValue("OutDetectArrowIdleGoods");
////设备发生故障自动变更路径
//CStaticClass.DeviceErrorAutoModifyRoutePath = CommonClassLib.AppSettings.GetValue("DeviceErrorAutoModifyRoutePath");
#endregion 系统配置文件初始化
//初始化管理和调度交互状态
IOControlService.AddIOControlStatus();
////初始化错误信息
BaseDeviceService.AddDeviceErrors();
//加载全局站台信息
CConfig.LoadConfig();
//初始化设备静态信息
BaseDeviceService.AddDeviceInfo();
//虚拟设备 PLC_DB2交互数据
CStaticClass.devinfo28 = BaseDeviceService.GetDeviceInfo(65534);
#region 界面布局
//主控
FrmControlMonitor.FormInstance.Show(this.dockPanel1);
FrmControlMonitor.FormInstance.DockTo(this.dockPanel1, DockStyle.Fill);
//任务列表窗口
FrmTaskList Frmlist = new FrmTaskList();
Frmlist.Show(this.dockPanel1);
Frmlist.DockTo(this.dockPanel1, DockStyle.Bottom);
Frmlist.DockState = WeifenLuo.WinFormsUI.Docking.DockState.DockBottom;
Frmlist.AutoHidePortion = 0.28;//(double)Frmlist.Height / (double)this.dockPanel1.Height;
Frmlist.CloseButton = false;
//运行异常窗口
FrmErrorMessage frmErrorMessage = new FrmErrorMessage();
frmErrorMessage.Show(this.dockPanel1);
frmErrorMessage.DockTo(this.dockPanel1, DockStyle.Bottom);
frmErrorMessage.DockState = WeifenLuo.WinFormsUI.Docking.DockState.DockBottomAutoHide;
frmErrorMessage.CloseButton = false;
//帮助信息窗口
FrmHelp frmHelp = new FrmHelp();
frmHelp.Show(this.dockPanel1);
frmHelp.DockTo(this.dockPanel1, DockStyle.Bottom);
frmHelp.DockState = WeifenLuo.WinFormsUI.Docking.DockState.DockBottomAutoHide;
frmHelp.CloseButton = false;
#endregion 界面布局
//检测是否登录
if (FrmLogin.FormInstance.ShowDialog() != DialogResult.OK) return; //dzf 调试时注释掉
CCarryConvert.WriteDarkCasket("Login", "UserID:" + CStaticClass.UserID + "的操作日志", "成功登录系统", "", "");
this.DoubleBuffered = true;
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.DoubleBuffer, true);
this.UpdateStyles();
}
private void FrmMain_Load(object sender, EventArgs e)
{
//SocketService();
}
#region 命令开关 接口服务
private CControl cc = new CControl();
private CListenPLCAsk cplc = new CListenPLCAsk();
///
/// 打开命令开关
///
///
///
private void MITurnOn_Click(object sender, EventArgs e)
{
try
{
MMDarketManage.Enabled = true;
MMUserManage.Enabled = true;
MIUserInfoManage.Enabled = true;
CStaticClass.Order = true;
MITurnOff.Enabled = true;
MITurnOn.Enabled = false;
MITurnOff.Checked = false;
MITurnOn.Checked = true;
//执行自动命令
CStaticClass.ReConnect();
MMDarketManage.Checked = true;
MMUserManage.Checked = false;
MIUserInfoManage.Checked = false;
this.Text = "瑞吉德自动化物流监控调度系统" + "--【正在执行自动命令!】";
FrmControlMonitor.FormInstance.FlashPanit("tsStatus", "", false);
//单次调用 与opc通信 取数据存放于CStaticClass.AllReturns
LogUtil.WriteLog("", "打开命令开关-获取opc数据");
CStaticClass.GetAllReturns();
CConfig.StartAll();
//后台独立线程 循环 解析plc读取的数据 CStaticClass.AllReturns 300ms 更新到设备内存中
LogUtil.WriteLog("", "打开命令开关-启动opcAllReturns数据解析");
CParsePLCData.StartListen();
//AGV相关服务启动
HttpServer.start();
//终端socket启动
}
catch (Exception ex)
{
MessageBox.Show(":" + ex.Message, "操作提示:", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
}
}
///
/// 关闭命令开关
///
///
///
private void MITurnOff_Click(object sender, EventArgs e)
{
if (MessageBox.Show("您确认要“关闭命令开关”吗?如果“关闭命令开关”将导致调度计算机与所有设备通讯中断!", "操作提示:", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) != DialogResult.OK)
{
return;
}
CStaticClass.Order = false;
MITurnOff.Enabled = false;
MITurnOn.Enabled = true;
MITurnOn.Checked = false;
MITurnOff.Checked = true;
HttpServer.close();
this.Text = "瑞吉德自动化物流监控调度系统";
//getAllReturnTimer.Enabled = false;
//getAllReturnTimer.Stop();
CConfig.StopAll();
CParsePLCData.EndListen();
}
#endregion 命令开关 接口服务
#region 按钮事件
///
/// 指令队列管理
///
///
///
private void MIAltMonitor_Click(object sender, EventArgs e)
{
FrmModifyMonitor.FormInstance.ShowDialog();
}
///
/// 调度任务管理
///
///
///
private void MIAltManange_Click(object sender, EventArgs e)
{
FrmModifyManage.FormInstance.ShowDialog();
}
///
/// 单一设备指令
///
///
///
private void toolStripMenuItem1_Click(object sender, EventArgs e)
{
FrmHandCommand.FormInstance.ShowDialog();
}
private void MIManageShow_Click(object sender, EventArgs e)
{
FrmAutoCommand.FormInstance.ShowDialog();
}
///
/// 叠盘机缓存管理
///
///
///
private void MIdp_Click(object sender, EventArgs e)
{
FrmStackerCache.FormInstance.ShowDialog();
}
///
/// 清除任务
///
///
///
private void MIClearTask_Click(object sender, EventArgs e)
{
DialogResult dr = MessageBox.Show("是否清除调度系统收到的任务信息?", "警告", MessageBoxButtons.YesNo);
if (dr == DialogResult.Yes)
{
DbHelperSQL.ExecuteSql("update t_warehouse set f_task_no='',f_task_type='',f_task_status='FREE',f_equip_type='',F_IO_WH_SORT_CODE='',F_LASTBOX_REACH_FLAG=0");
DbHelperSQL.ExecuteSql("delete t_manage_task");
DbHelperSQL.ExecuteSql("delete t_monitor_task");
}
}
///
/// 浏览黑匣子文件
///
///
///
private void MISeeDarket_Click(object sender, EventArgs e)
{
FrmBrowseDarkCasket.FormInstance.ShowDialog();
}
private void MIAbout_Click(object sender, EventArgs e)
{
new FrmAboutBox().ShowDialog();
}
private void MMExitSystem_Click(object sender, EventArgs e)
{
DialogResult dr = MessageBox.Show("真的要退出系统?", "提示", MessageBoxButtons.YesNo);
if (dr == DialogResult.Yes)
{
this.Close();
}
}
private void DeviceStatusSearchMenuItem_Click(object sender, EventArgs e)
{
FrmDeviceErrorLog.FormInstance.ShowDialog();
}
///
/// 设备状态
///
///
///
private void MIDeviceState_Click(object sender, EventArgs e)
{
FrmDeviceInfoEdit.FormInstance.ShowDialog();
}
#endregion 按钮事件
private void MonitorDataBackUpMenuItem_Click(object sender, EventArgs e)
{
try
{
string localFilePath;
string saveFilepath = "E:\\";
saveFileDialog1.Title = "备份调度系统数据库...";
saveFileDialog1.FileName = DateTime.Now.ToString("yyyyMMddHHmmss") + "DBBak";
saveFileDialog1.Filter = "所有文件(*.*)|*.*";
if (System.IO.Directory.Exists(saveFilepath))//文件目录是否存在
{
saveFileDialog1.InitialDirectory = saveFilepath;
}
saveFileDialog1.RestoreDirectory = true;
//saveFileDialog1.CheckFileExists = true;
saveFileDialog1.CheckPathExists = true;
saveFileDialog1.OverwritePrompt = true;
if (this.saveFileDialog1.ShowDialog() == DialogResult.OK)
{
localFilePath = saveFileDialog1.FileName.ToString();
string sql = string.Format("Backup database AHFY_WCS to disk = '{0}'", localFilePath); //MyTest为远程数据库名称,也可以改成用变量传入
DbHelperSQL.ExecuteSql(sql);
//下面判断文件是否生成来确定是否备份成功
if (System.IO.File.Exists(localFilePath))
{
MessageBox.Show("数据库备份成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
else
{
MessageBox.Show("数据库备份失败!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
//还原是一样的.只是sql改成"RESTORE FILELISTONLY FROM DISK ='路径'"
}
}
catch (Exception err)
{
MessageBox.Show(err.Message);
}
}
private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
{
this.TopMost = true;
this.Visible = true;
this.TopMost = false;
this.WindowState = FormWindowState.Maximized;
}
private void notifyIcon1_BalloonTipShown(object sender, EventArgs e)
{
try
{
//Voice.Speak("123", SpFlags);
//Voice.Speak(notifyIcon1.BalloonTipText, SpFlags);
}
catch (Exception ex)
{
}
}
private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)
{
if (MessageBox.Show("您确认要退出瑞吉德自动化物流监控调度系统吗?", "操作提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
{
CParsePLCData.EndListen();
CCarryConvert.WriteDarkCasket("Login", "UserID:" + CStaticClass.UserID + "的操作日志", "退出系统", "", "");
System.Diagnostics.Process.GetCurrentProcess().Kill();
}
else
{
e.Cancel = true;
}
}
private void SocketService()
{
string IP = AppSettings.GetValue("AndroidIP");
int port = int.Parse(AppSettings.GetValue("Port"));
socket.Bind(new IPEndPoint(IPAddress.Parse(IP), port));
socket.Listen(10);
Thread myThread = new Thread(ListenClientConnect);
myThread.Start();
}
///
/// 监听客户端连接
///
private static void ListenClientConnect()
{
while (true)
{
Socket clientSocket = socket.Accept();
//System.Console.WriteLine("客户的本地端口是:" + clientSocket.LocalEndPoint.ToString());
//System.Console.WriteLine("客户端是:" + clientSocket.RemoteEndPoint.ToString());
System.Console.WriteLine(clientSocket.Connected);
Thread receiveThread = new Thread(ReceiveMessage);
System.Console.WriteLine(clientSocket.Connected);
receiveThread.Start(clientSocket);
}
}
private static void ReceiveMessage(object clientSocket)
{
Socket myClientSocket = (Socket)clientSocket;
//System.Console.WriteLine(myClientSocket.Connected+"1");
while (true)
{
//System.Console.WriteLine(myClientSocket.Connected + "2");
try
{
//System.Console.WriteLine(myClientSocket.Connected + "3");
if (myClientSocket.Connected && myClientSocket != null)
{
//通过clientSocket接收数据
int receiveNumber = myClientSocket.Receive(result);
if (receiveNumber == 0)
{
return;
}
Console.WriteLine(myClientSocket.RemoteEndPoint.ToString(), Encoding.UTF8.GetString(result, 0, receiveNumber));
string receiveData = Encoding.UTF8.GetString(result, 0, receiveNumber);
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(receiveData);
XmlNode nodeRoot = xmlDoc.SelectSingleNode("DataFromZD");
string method = nodeRoot.SelectSingleNode(@"Method").InnerText;
XmlNodeList xnlBOX_BARCODE = nodeRoot.SelectNodes(@"BoxsCodes");
string sBOX_BARCODE = string.Empty;
foreach (XmlNode nBOX_BARCODE in xnlBOX_BARCODE)
{
sBOX_BARCODE += nBOX_BARCODE.InnerText + ",";
}
string[] boxs = Regex.Split(sBOX_BARCODE, "(?<=\\G.{12})");
if (boxs.Length > 1)
{
Array.Resize(ref boxs, boxs.Length - 1);
}
sBOX_BARCODE = string.Empty;
foreach (string box in boxs)
{
sBOX_BARCODE += box + ",";
}
sBOX_BARCODE = sBOX_BARCODE.TrimEnd(',');
XmlNodeList xnlGOODS_BARCODE = nodeRoot.SelectNodes(@"GoodsCodes");
string sGOODS_BARCODE = string.Empty;
foreach (XmlNode nGOODS_BARCODE in xnlGOODS_BARCODE)
{
sGOODS_BARCODE += nGOODS_BARCODE.InnerText + ",";
}
string[] goods = Regex.Split(sGOODS_BARCODE, "(?<=\\G.{22})");
if (goods.Length > 1)
{
Array.Resize(ref goods, goods.Length - 1);
}
sGOODS_BARCODE = string.Empty;
foreach (string good in goods)
{
sGOODS_BARCODE += good + ",";
}
sGOODS_BARCODE = sGOODS_BARCODE.TrimEnd(',');
DataView dvt = DbHelperSQL.Query("select F_TASK_NO,F_TASK_TYPE,F_EQUIP_TYPE from T_WareHouse").Tables[0].DefaultView;
string sResult = string.Empty;
bool bResult;
switch (method)
{
case "boxsin":
bResult = (new getInStackLocation()).Notify(dvt[0]["F_TASK_NO"].ToString(), sBOX_BARCODE, "", out sResult);
getInStackLocation.DATA outData = (new Base()).DeSerialize(sResult);
if (bResult)
{
new ManageTaskService().CreateMove(dvt[0]["F_TASK_NO"].ToString(), "1", "12001", outData.LOC_NO, sBOX_BARCODE, out sResult);
sResult = outData.LOC_NO;
}
else
{
sResult = outData.ERROR_INFO;
}
break;
case "goodsin":
bResult = (new getInOutCheckInfo()).Notify(dvt[0]["F_TASK_NO"].ToString(), "02", "", sBOX_BARCODE, sGOODS_BARCODE, out sResult);
getInOutCheckInfo.DATA op = (new Base()).DeSerialize(sResult);
if (bResult)
{
sResult = "true";
}
else
{
sResult = op.ERROR_INFO;
}
break;
case "outdetail":
bResult = (new getInOutCheckInfo()).Notify(dvt[0]["F_TASK_NO"].ToString(), "01", string.Empty, sBOX_BARCODE, string.Empty, out sResult);
if (bResult)
{
getInOutCheckInfo.DATA info = (new Base()).DeSerialize(sResult);
if (info.OUT_MODE.Equals("1"))
{
sResult = "true";
}
else if (info.OUT_MODE.Equals("2"))
{
sResult = "back";
}
else if (info.OUT_MODE.Equals("3"))
{
sResult = info.REPICK_ARRAY;
}
}
else
{
sResult = "false";
}
break;
case "gettask":
DataView dv = DbHelperSQL.Query("select * from t_warehouse").Tables[0].DefaultView;
sResult = dv[0]["f_task_no"].ToString();
break;
case "login":
Object o = DbHelperSQL.GetSingle("select * from t_base_users where f_password='" + sBOX_BARCODE + "'");
if (o != null)
{
sResult = "true";
}
else
{
sResult = "false";
}
break;
}
byte[] bs = Encoding.UTF8.GetBytes(sResult);
myClientSocket.Send(bs, bs.Length, 0);
myClientSocket.Close();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
myClientSocket.Shutdown(SocketShutdown.Both);
myClientSocket.Close();
break;
}
}
}
private void 海柔测试ToolStripMenuItem_Click(object sender, EventArgs e)
{
TEST1.FormInstance.ShowDialog();
}
private void 接口恢复ToolStripMenuItem_Click(object sender, EventArgs e)
{
FrmInterfaceRestart.FormInstance.ShowDialog();
}
private void FrmMain_FormClosed(object sender, FormClosedEventArgs e)
{
System.Diagnostics.Process.GetCurrentProcess().Kill();
}
private void MIHandShow_Click(object sender, EventArgs e)
{
FrmHandCommand.FormInstance.ShowDialog();
}
}
}