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 } }