352 lines
14 KiB
C#
352 lines
14 KiB
C#
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
|
||
{
|
||
/// <summary>
|
||
/// MainWindow.xaml 的交互逻辑
|
||
/// </summary>
|
||
public partial class MainWindow : Window
|
||
{
|
||
#region 属性 -> 程序运行的全局参数和变量
|
||
/// <summary>
|
||
/// 公共数据库连接类
|
||
/// </summary>
|
||
private Common.OracleHelper LocalOracle { get; set; }
|
||
/// <summary>
|
||
/// 窗口日志列表集合对象
|
||
/// </summary>
|
||
private ObservableCollection<ResultMessage> NotifyMessages { get; set; }
|
||
|
||
/// <summary>
|
||
/// 传输客户端定时器
|
||
/// </summary>
|
||
private DispatcherTimer CilentTimer { get; set; }
|
||
/// <summary>
|
||
/// 压缩文件上传线程
|
||
/// </summary>
|
||
private Thread FileUploadThread { get; set; }
|
||
/// <summary>
|
||
/// Socket通讯连接客户端对象
|
||
/// </summary>
|
||
private BLL.SuperSocketClient SocketClient { get; set; }
|
||
/// <summary>
|
||
/// Socket通讯客户端服务区标识
|
||
/// </summary>
|
||
private string SocketServerpartCode { get; set; }
|
||
#endregion
|
||
|
||
#region 构造 -> 区服Socket指令通讯传输模式程序
|
||
public MainWindow()
|
||
{
|
||
InitializeComponent();
|
||
}
|
||
#endregion
|
||
|
||
#region 事件 -> 程序启动时的初始化加载
|
||
/// <summary>
|
||
/// 程序启动加载事件
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
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<ResultMessage>();
|
||
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 事件 -> 窗口功能按钮
|
||
/// <summary>
|
||
/// 窗口功能按钮事件
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
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 事件 -> 程序运行自检定时器(传输通讯程序启动的代码)
|
||
/// <summary>
|
||
/// 主程序定时器
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
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通讯程序输出的日志处理
|
||
/// <summary>
|
||
/// Socket通讯程序输出的日志处理方法
|
||
/// </summary>
|
||
/// <param name="sender"></param>
|
||
/// <param name="e"></param>
|
||
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);
|
||
/// <summary>
|
||
/// 程序窗口日志显示处理事件
|
||
/// </summary>
|
||
/// <param name="triggerTime"></param>
|
||
/// <param name="resultMessage"></param>
|
||
private void TransResultBeginInvoke(DateTime triggerTime, string resultMessage)
|
||
{
|
||
Dispatcher.BeginInvoke(new DelegateTransResult(TransResult), new object[] { triggerTime, resultMessage });
|
||
}
|
||
|
||
/// <summary>
|
||
/// 运行日志呈现
|
||
/// </summary>
|
||
/// <param name="triggerTime">日志时间</param>
|
||
/// <param name="resultMessage">日志内容</param>
|
||
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);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 运行日志记录表结构
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
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
|
||
|
||
|
||
}
|
||
}
|