2025-03-28 09:49:56 +08:00

352 lines
14 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 1Socket连接状态
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/RecordLogToOracleSocket消息通知执行结果到云端
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
}
}