using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Threading;
namespace ServerPartTransferClient
{
///
/// MainWindow.xaml 的交互逻辑
///
public partial class MainWindow : Window
{
#region 属性 -> 程序运行的全局参数和变量
///
/// 公共数据库连接类
///
private Common.OracleHelper LocalOracle { get; set; }
///
/// 窗口日志列表集合对象
///
private ObservableCollection NotifyMessages { get; set; }
///
/// 传输客户端定时器
///
private DispatcherTimer CilentTimer { get; set; }
///
/// 压缩文件上传线程
///
private Thread FileUploadThread { get; set; }
///
/// Socket通讯连接客户端对象
///
private BLL.SuperSocketClient SocketClient { get; set; }
///
/// Socket通讯客户端服务区标识
///
private string SocketServerpartCode { get; set; }
#endregion
#region 构造 -> 区服Socket指令通讯传输模式程序
public MainWindow()
{
InitializeComponent();
}
#endregion
#region 事件 -> 程序启动时的初始化加载
///
/// 程序启动加载事件
///
///
///
private void Window_Loaded(object sender, RoutedEventArgs e)
{
#region 初始化本地数据库连接对象
string[] args_OracleConn = ConfigurationManager.AppSettings["OracleConnStr"].Split(',');
//初始化本地数据库连接对象
LocalOracle = new Common.OracleHelper(args_OracleConn[0], args_OracleConn[4],
args_OracleConn[1], args_OracleConn[2], args_OracleConn[3]);
#endregion
string WLog = ConfigurationManager.AppSettings["OracleConnStr"].ToString();
#region 初始化窗口日志显示列表对象
if (NotifyMessages == null)
{
NotifyMessages = new ObservableCollection();
DataTransResult.AutoGenerateColumns = false;
DataTransResult.SelectionMode = DataGridSelectionMode.Single;
DataTransResult.ItemsSource = NotifyMessages;
}
#endregion
#region 初始化程序运行自检定时器(传输通讯程序启动的代码),每隔1分钟检查一下Socket连接状态
CilentTimer = new DispatcherTimer
{
Interval = TimeSpan.FromSeconds(60)
};
CilentTimer.Tick += CilentTimer_Tick;
CilentTimer.Start();
#endregion
#region 初始化窗口显示
BtnTimerState.Content = CilentTimer.IsEnabled ? "停止" : "启动";
Title = "服务区数据传输工具 STCv" + System.Windows.Forms.Application.ProductVersion;
//-------默认直接加载启动--------//
if (CilentTimer.IsEnabled)
WLog += ",启动程序" + System.Windows.Forms.Application.ProductVersion;
#region 读取压缩文件上传地址
//读取文件上传地址
string _UploadRuningStateUrl = ConfigurationManager.AppSettings["FileUploadUrl"];
#endregion
#region 获取服务区编码信息
if (string.IsNullOrWhiteSpace(SocketServerpartCode))
{
DataTable table_Serverpart = LocalOracle.ExcuteSqlGetDataSet(
"SELECT SERVERPART_CODE,SERVERPART_NAME FROM HIGHWAY_EXCHANGE.T_SERVERPART").Tables[0];
if (table_Serverpart.Rows.Count > 0)
SocketServerpartCode = table_Serverpart.Rows[0]["SERVERPART_CODE"].ToString();
}
#endregion
SocketClient = new BLL.SuperSocketClient($"ws://pos.eshangtech.com:7199/?" +
$"ServerpartCode={SocketServerpartCode}&ShopCode=000000&MachineCode=0000",
SocketServerpartCode, "", "", _UploadRuningStateUrl);
///启动Socket客户端连接
SocketClient.Start();
WLog += ",启动Socket客户端";
SocketClient.NotifyEvent += SocketClient_NotifyEvent;
Common.LogHelper.WriteLog(WLog, "通讯文本", "D:/WriteLog");
#endregion
}
#endregion
#region 事件 -> 窗口功能按钮
///
/// 窗口功能按钮事件
///
///
///
private void Button_Click(object sender, RoutedEventArgs e)
{
Button _Button = (Button)sender;
switch (_Button.Name)
{
case "BtnTimerState":
#region 启动/停止功能按钮
if (CilentTimer != null)
{
if (CilentTimer.IsEnabled)
{
CilentTimer.Stop();
_Button.Content = "启动";
TransResultBeginInvoke(DateTime.Now, "数据传输定时器已停止");
}
else
{
CilentTimer.Start();
_Button.Content = "停止";
TransResultBeginInvoke(DateTime.Now, "数据传输定时器已启动");
}
}
else
{
TransResultBeginInvoke(DateTime.Now, "数据传输定时器初始化失败,请重启程序!");
}
#endregion
break;
case "BtnClosed":
#region 退出程序功能按钮
if (CilentTimer != null && CilentTimer.IsEnabled)
{
CilentTimer.Stop();
}
Close();
#endregion
break;
}
}
#endregion
#region 事件 -> 程序运行自检定时器(传输通讯程序启动的代码)
///
/// 主程序定时器
///
///
///
private void CilentTimer_Tick(object sender, EventArgs e)
{
if (FileUploadThread == null || !FileUploadThread.IsAlive)
{
FileUploadThread = new Thread(() =>
{
#region 读取压缩文件上传地址
//读取文件上传地址
string _UploadRuningStateUrl = ConfigurationManager.AppSettings["FileUploadUrl"];
if (string.IsNullOrWhiteSpace(_UploadRuningStateUrl))
{
TransResultBeginInvoke(DateTime.Now, $"数据文件上传启动失败。原因:参数[FileUploadUrl]未配置。");
return;
}
#endregion
#region 获取服务区编码信息
try
{
if (string.IsNullOrWhiteSpace(SocketServerpartCode))
{
DataTable table_Serverpart = LocalOracle.ExcuteSqlGetDataSet(
"SELECT SERVERPART_CODE,SERVERPART_NAME FROM HIGHWAY_EXCHANGE.T_SERVERPART").Tables[0];
if (table_Serverpart.Rows.Count > 0)
{
SocketServerpartCode = table_Serverpart.Rows[0]["SERVERPART_CODE"].ToString();
}
}
}
catch (Exception ex) { }
#endregion
#region 检查Socket通讯客户端服务区标识
if (string.IsNullOrWhiteSpace(SocketServerpartCode))
{
TransResultBeginInvoke(DateTime.Now, $"数据文件上传启动失败。原因:缺少服务区编码信息。");
return;
}
#endregion
#region 启动Socket客户端连接程序
if (SocketClient == null)
{
//初始化Socket客户端对象
SocketClient = new BLL.SuperSocketClient($"ws://pos.eshangtech.com:7199/?" +
$"ServerpartCode={SocketServerpartCode}&ShopCode=000000&MachineCode=0000",
SocketServerpartCode, "", "", _UploadRuningStateUrl);
SocketClient.NotifyEvent += SocketClient_NotifyEvent; ;
TransResultBeginInvoke(DateTime.Now, $"启动Socket通讯客户端。服务区编码:{ SocketServerpartCode }。");
}
//启动Socket客户端连接
if (!SocketClient.ClientRuning)
SocketClient.Start();
#endregion
})
{
IsBackground = true
};
FileUploadThread.Start();
}
}
#endregion
#region 方法 -> Socket通讯程序输出的日志处理
///
/// Socket通讯程序输出的日志处理方法
///
///
///
private void SocketClient_NotifyEvent(object sender, Model.Common.NotifyEventArgs e)
{
//string DirectoryName = AppDomain.CurrentDomain.BaseDirectory + "/SocketLog";
string DirectoryName = "D:/SocketLog";
//记录文本日志
//Common.LogHelper.WriteLog(e.NotifyLoggerMessage, "", DirectoryName);
Common.LogHelper.WriteLog(e.NotifyLoggerMessage, "通讯文本", "D:/WriteLog");
#region 调用云端【/WebSocket/RecordLogToOracle】接口上报Socket消息通知执行结果到云端
try
{
Common.LogHelper.WriteServiceLog($"是否调用日志上传接口:" + e.NotifyUploadState);
//只有通知上传状态为True的消息才上传到云端
if (e.NotifyUploadState)
{
//文件上传耗时记录
string str_HttpURL = "http://pos.eshangtech.com:7198/webApi_publish/WebSocket/RecordLogToOracle";
string str_PostData = $"ServerpartCode={SocketServerpartCode}&ShopCode=000000&" +
$"MachineCode=0000&LogCentent={e.NotifyLoggerMessage}&TableName={(int)e.NotifyLoggerType}" +
$"&OperateTime={e.NotifyLoggerTime.ToString("yyyyMMddHHmmss")}";
string Result = Common.HttpDataHelper.OnPost($"{str_HttpURL}?{str_PostData}", str_PostData);
Common.LogHelper.WriteServiceLog($"开始上传日志【{str_PostData}】,上传结果:" + Result);
}
}
catch (Exception ex)
{
Common.LogHelper.WriteLog($"{ e.NotifyLoggerType }执行结果上报失败。原因:{ex.Message}", "", DirectoryName);
}
#endregion
//界面显示消息内容
TransResultBeginInvoke(e.NotifyLoggerTime, e.NotifyLoggerMessage);
}
#endregion
#region 委托 -> 程序窗口日志显示处理委托事件
private delegate void DelegateTransResult(DateTime triggerTime, string resultMessage);
///
/// 程序窗口日志显示处理事件
///
///
///
private void TransResultBeginInvoke(DateTime triggerTime, string resultMessage)
{
Dispatcher.BeginInvoke(new DelegateTransResult(TransResult), new object[] { triggerTime, resultMessage });
}
///
/// 运行日志呈现
///
/// 日志时间
/// 日志内容
private void TransResult(DateTime triggerTime, string resultMessage)
{
//生成日志显示对象
ResultMessage ResultMessage = new ResultMessage()
{
TransDate = triggerTime,
TransResult = resultMessage
};
//添加日志对象到窗口列表
NotifyMessages.Insert(0, ResultMessage);
//清理日志列表,界面只显示最近30分钟的日志信息
foreach (ResultMessage _RowTemp in NotifyMessages.ToList().FindAll(p => p.TransDate < DateTime.Now.AddMinutes(-30)))
{
NotifyMessages.Remove(_RowTemp);
}
}
///
/// 运行日志记录表结构
///
///
private class ResultMessage : CNotifyPropertyChange
{
public DateTime TransDate { get; set; }
public string TransResult { get; set; }
}
public class CNotifyPropertyChange : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChange(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
#endregion
}
}