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

307 lines
12 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.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;
namespace ServerPartTransferClient
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
#region
/// <summary>
/// 公共数据库连接类
/// </summary>
private Transmission.SDK.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 Common.SuperSocketClient SocketClient { get; set; }
/// <summary>
/// Socket通讯客户端服务区标识
/// </summary>
private string SocketServerpartCode { get; set; }
#endregion
public MainWindow()
{
InitializeComponent();
}
#region ->
/// <summary>
/// 程序启动加载事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Window_Loaded(object sender, RoutedEventArgs e)
{
string[] args_OracleConn = ConfigurationManager.AppSettings["OracleConnStr"].Split(',');
//初始化本地数据库连接对象
LocalOracle = new Transmission.SDK.OracleHelper(args_OracleConn[0], args_OracleConn[4],
args_OracleConn[1], args_OracleConn[2], args_OracleConn[3]);
#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(10)
};
CilentTimer.Tick += CilentTimer_Tick;
CilentTimer.Start();
#endregion
BtnTimerState.Content = "停止";
Title = "服务区数据传输工具 STCv" + System.Windows.Forms.Application.ProductVersion;
}
#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":
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, "数据传输定时器初始化失败,请重启程序!");
}
break;
case "BtnClosed":
if (CilentTimer != null && CilentTimer.IsEnabled)
{
CilentTimer.Stop();
}
Close();
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 Common.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, Transmission.SDK.Model.Common.NotifyEventArgs e)
{
string DirectoryName = AppDomain.CurrentDomain.BaseDirectory + "/SocketLog";
//记录文本日志
Transmission.SDK.LogHelper.WriteLog(e.NotifyLoggerMessage, "", DirectoryName);
#region /WebSocket/RecordLogToOracleSocket消息通知执行结果到云端
try
{
Transmission.SDK.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 = Transmission.SDK.HttpDataHelper.OnPost($"{str_HttpURL}?{str_PostData}", str_PostData);
Transmission.SDK.LogHelper.WriteServiceLog($"开始上传日志【{str_PostData}】,上传结果:" + Result);
}
}
catch (Exception ex)
{
Transmission.SDK.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
}
}