using System; using System.Collections; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Threading; using System.Windows; using System.Windows.Controls; using System.Windows.Threading; using Transmission.SDK.ThreadPool; namespace CoopMerchantClient { /// /// MainWindow.xaml 的交互逻辑 /// public partial class MainWindow : Window { protected string TimerInterval = ConfigurationManager.AppSettings["Interval"]; /// /// 移动业务数据传输线程 /// ClientThread MSPClientThread = new ClientThread(); /// /// 移动业务数据传输配置 /// ConfigThread MSPConfigThread = null; /// /// 普通业务数据传输线程 /// ClientThread HWSClientThread = new ClientThread(); /// /// 普通业务数据传输配置 /// ConfigThread HWSConfigThread = null; /// /// 基础业务数据传输线程 /// ClientThread PFFWClientThread = new ClientThread(); /// /// 基础业务数据传输配置 /// ConfigThread PFFWConfigThread = null; /// /// 交易业务数据传输线程 /// ClientThread HWSDClientThread = new ClientThread(); /// /// 交易业务数据传输配置 /// ConfigThread HWSDConfigThread = null; /// /// 数据版本反馈传输线程 /// ClientThread CMFBClientThread = new ClientThread(); /// /// 数据版本反馈传输配置 /// ConfigThread CMFBConfigThread = null; /// /// 传输客户端定时器 /// DispatcherTimer CilentTimer = new DispatcherTimer(); /// /// HIGHWAY_STORAGE数据库连接类 /// Transmission.SDK.OracleHelper HWSOracle; /// /// HIGHWAY_SELLDATA数据库连接类 /// Transmission.SDK.OracleHelper HWSDOracle; /// /// PLATFORM_FRAMEWORK数据库连接类 /// Transmission.SDK.OracleHelper PFFWOracle; /// /// HIGHWAY_EXCHANGE数据库连接类 /// Transmission.SDK.OracleHelper HWEXOracle; /// /// 运行状态上报时间 /// DateTime StateUploadTime; /// /// 运行状态上报线程 /// Thread StateUploadThread; /// /// 运行日志记录 /// DataTable TransResultTable; /// /// 省份信息缓存表 /// DataTable ProvinceTable; /// /// 省份信息缓存有效期 /// DateTime ProvinceCacheTime; /// /// 是否首次执行 /// bool IsFirstRun = true; public MainWindow() { InitializeComponent(); //绑定上传回调事件 MSPClientThread.UploadStringEvent += new ClientThread.OutputResultsUploadArg(ClientThread_UploadStringEvent); HWSClientThread.UploadStringEvent += new ClientThread.OutputResultsUploadArg(ClientThread_UploadStringEvent); HWSDClientThread.UploadStringEvent += new ClientThread.OutputResultsUploadArg(ClientThread_UploadStringEvent); PFFWClientThread.UploadStringEvent += new ClientThread.OutputResultsUploadArg(ClientThread_UploadStringEvent); CMFBClientThread.UploadStringEvent += new ClientThread.OutputResultsUploadArg(ClientThread_UploadStringEvent); CilentTimer.Tick += CilentTimer_Tick; double timeInterval = 0; try { if (!double.TryParse(TimerInterval, out timeInterval) || timeInterval < 1 || timeInterval > 10) { timeInterval = 5; } } catch { timeInterval = 5; } timeInterval = timeInterval * 60 * 1000; CilentTimer.Interval = TimeSpan.FromMilliseconds(timeInterval); CilentTimer.Start(); BtnTimerState.Content = "停止"; Title = "省份数据传输工具 CMCv" + System.Windows.Forms.Application.ProductVersion; int _FileCount = 0; string[] _masks = { ".log" }; try { Transmission.SDK.LogHelper.DeleteFiles( AppDomain.CurrentDomain.BaseDirectory + "\\log", new string[] { ".log" }, false, false, ref _FileCount); } catch { } } #region 事件 -> 主窗体按钮事件 /// /// 主窗体按钮事件 /// /// /// 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 事件 -> 主线程定时器 /// /// 主线程定时器 /// /// /// private void CilentTimer_Tick(object sender, EventArgs e) { try { if (HWSOracle == null || !HWSOracle.ConnTest()) { string _HWSConnString = ConfigurationManager.AppSettings["HIGHWAY_STORAGE"]; HWSOracle = new Transmission.SDK.OracleHelper(_HWSConnString.Split(',')[0], _HWSConnString.Split(',')[4], _HWSConnString.Split(',')[1], _HWSConnString.Split(',')[2], _HWSConnString.Split(',')[3]); } if (HWSDOracle == null || !HWSDOracle.ConnTest()) { string _HWSDConnString = ConfigurationManager.AppSettings["HIGHWAY_SELLDATA"]; HWSDOracle = new Transmission.SDK.OracleHelper(_HWSDConnString.Split(',')[0], _HWSDConnString.Split(',')[4], _HWSDConnString.Split(',')[1], _HWSDConnString.Split(',')[2], _HWSDConnString.Split(',')[3]); } if (PFFWOracle == null || !PFFWOracle.ConnTest()) { string _PFFWConnString = ConfigurationManager.AppSettings["PLATFORM_FRAMEWORK"]; PFFWOracle = new Transmission.SDK.OracleHelper(_PFFWConnString.Split(',')[0], _PFFWConnString.Split(',')[4], _PFFWConnString.Split(',')[1], _PFFWConnString.Split(',')[2], _PFFWConnString.Split(',')[3]); } if (HWEXOracle == null || !HWEXOracle.ConnTest()) { string _HWEXConnString = ConfigurationManager.AppSettings["HIGHWAY_EXCHANGE"]; HWEXOracle = new Transmission.SDK.OracleHelper(_HWEXConnString.Split(',')[0], _HWEXConnString.Split(',')[4], _HWEXConnString.Split(',')[1], _HWEXConnString.Split(',')[2], _HWEXConnString.Split(',')[3]); } if (IsFirstRun) { IsFirstRun = false; Dictionary _CheckList = new Dictionary(); _CheckList.Add("HIGHWAY_STORAGE.T_SERVERPARTSHOP", "门店表添加字段"); CheckOracleTable(HWSOracle, _CheckList); } //运行状态上传线程 if (StateUploadTime < DateTime.Now) { StateUploadTime = DateTime.Now.AddMinutes(5); if (StateUploadThread == null || !StateUploadThread.IsAlive) { StateUploadThread = new Thread(() => AppStateUpload(HWSOracle)) { IsBackground = true }; StateUploadThread.Start(); } } TransResultBeginInvoke(DateTime.Now, "正在预启动上传子线程......"); if (HWSConfigThreadConfigure()) { if (HWSClientThread.onState(HWSOracle)) { TransResultBeginInvoke(DateTime.Now, "普通业务数据上传线程预启动成功"); } else { TransResultBeginInvoke(DateTime.Now, "普通业务数据上传线程预启动失败"); } } if (HWSDConfigThreadConfigure()) { if (HWSDClientThread.onState(HWSDOracle)) { TransResultBeginInvoke(DateTime.Now, "交易业务数据上传线程预启动成功"); } else { TransResultBeginInvoke(DateTime.Now, "交易业务数据上传线程预启动失败"); } } if (MSPConfigThreadConfigure()) { if (MSPClientThread.onState(HWSOracle)) { TransResultBeginInvoke(DateTime.Now, "移动业务数据上传线程预启动成功"); } else { TransResultBeginInvoke(DateTime.Now, "移动业务数据上传线程预启动失败"); } } if (PFFWConfigThreadConfigure()) { if (PFFWClientThread.onState(PFFWOracle)) { TransResultBeginInvoke(DateTime.Now, "基础业务数据上传线程预启动成功"); } else { TransResultBeginInvoke(DateTime.Now, "基础业务数据上传线程预启动失败"); } } if (CMFBConfigThreadConfigure()) { if (CMFBClientThread.onState(PFFWOracle)) { TransResultBeginInvoke(DateTime.Now, "数据版本反馈上传线程预启动成功"); } else { TransResultBeginInvoke(DateTime.Now, "数据版本反馈上传线程预启动失败"); } } } catch (Exception ex) { TransResultBeginInvoke(DateTime.Now, "传输启动失败:" + ex.Message); Transmission.SDK.LogHelper.WriteServiceLog("传输启动失败:" + ex.Message); } } #endregion #region 方法 -> 校验并更新数据库表结构 /// /// 校验并更新数据库表结构 /// /// /// private void CheckOracleTable(Transmission.SDK.OracleHelper localOracle, Dictionary checkList) { DataBaseUpdate _DataBaseUpdate = new DataBaseUpdate(localOracle); foreach (string _Key in checkList.Keys) { _DataBaseUpdate.AlterTable(_Key); } } #endregion #region 方法 -> APP运行状态上报 /// /// APP运行状态上报 /// /// 数据库连接类 private void AppStateUpload(Transmission.SDK.OracleHelper localOracle) { try { int _DeleteCount = localOracle.ExcuteSql("DELETE FROM HIGHWAY_STORAGE.T_OPERATELOG WHERE NVL(TRANSFER_STATE,0) = 9"); TransResultBeginInvoke(DateTime.Now, $"无效传输日志记录清理完成:本次清理{_DeleteCount}条。"); } catch (Exception ex) { TransResultBeginInvoke(DateTime.Now, $"无效传输日志记录清理失败。原因:{ex.Message}"); } try { if (ProvinceTable == null || ProvinceCacheTime < DateTime.Now) { ProvinceTable = localOracle.ExcuteSqlGetDataSet( @"SELECT SERVERPARTCODE,PROVINCE_CODE,SERVERPART_NAME FROM HIGHWAY_EXCHANGE.T_SYSCODE").Tables[0]; if (ProvinceTable.Rows.Count == 0) { ProvinceCacheTime = DateTime.Now.AddMinutes(5); } else { ProvinceCacheTime = DateTime.Now.AddHours(1); } } string _UploadRuningStateUrl = ConfigurationManager.AppSettings["UploadRuningStateUrl"]; if (string.IsNullOrWhiteSpace(_UploadRuningStateUrl)) { TransResultBeginInvoke(DateTime.Now, $"APP运行状态上报失败。原因:参数[UploadRuningStateUrl]未配置。"); return; } foreach (DataRow ProvinceRow in ProvinceTable.Rows) { Hashtable hashtable = new Hashtable { { "provinceCode", ProvinceRow["SERVERPART_CODE"].ToString() }, { "provinceName", ProvinceRow["SERVERPART_NAME"].ToString() }, { "serverPartCode", ProvinceRow["SERVERPART_CODE"].ToString() }, { "serverPartName", ProvinceRow["SERVERPART_NAME"].ToString() }, { "appName", System.Windows.Forms.Application.ProductName }, { "appVersion", $"CMCv{System.Windows.Forms.Application.ProductVersion}" } }; Transmission.SDK.SoapWSHelper.QuerySoapWebServiceString( $"{_UploadRuningStateUrl}/Service.asmx", "UploadTransClientState", hashtable); } } catch (Exception ex) { TransResultBeginInvoke(DateTime.Now, $"APP运行状态上报失败。原因:{ex.Message}"); } } #endregion #region 方法 -> 基础业务数据上传配置 /// /// 基础业务数据上传配置 /// private bool PFFWConfigThreadConfigure() { string _MobileServicePlatformDataUrl; try { _MobileServicePlatformDataUrl = ConfigurationManager.AppSettings["MobileServicePlatformDataUrl"]; } catch { _MobileServicePlatformDataUrl = ""; } if (string.IsNullOrWhiteSpace(_MobileServicePlatformDataUrl)) { TransResultBeginInvoke(DateTime.Now, $"基础业务数据上传线程启动失败。原因:参数[MobileServicePlatformDataUrl]未配置。"); return false; } if (PFFWConfigThread == null) { PFFWConfigThread = new ConfigThread(""); } PFFWClientThread.IsUpload(true, new List { "T_USER", "T_USERTYPE" }); PFFWClientThread.IsDownload(false); try { PFFWClientThread.setConfiguration($"{_MobileServicePlatformDataUrl}/Service.asmx", "", "888888", "", "", "", "", 50, 1); PFFWClientThread.setConfigThread(PFFWConfigThread); } catch (Exception ex) { TransResultBeginInvoke(DateTime.Now, "基础业务数据上传配置失败:" + ex.Message); Transmission.SDK.LogHelper.WriteServiceLog("基础业务数据上传配置失败:" + ex.Message); } return true; } #endregion #region 方法 -> 普通业务数据上传配置 /// /// 普通业务数据上传配置 /// private bool HWSConfigThreadConfigure() { string _HighwayStorageDataUrl; try { _HighwayStorageDataUrl = ConfigurationManager.AppSettings["HighwayStorageDataUrl"]; } catch { _HighwayStorageDataUrl = ""; } if (string.IsNullOrWhiteSpace(_HighwayStorageDataUrl)) { TransResultBeginInvoke(DateTime.Now, $"普通业务数据上传线程启动失败。原因:参数[HighwayStorageDataUrl]未配置。"); return false; } if (HWSConfigThread == null) { HWSConfigThread = new ConfigThread(""); } HWSClientThread.IsUpload(true, new List { "T_WECHATPUSHDETAIL", "T_WECHATPUSHSALES" }); HWSClientThread.IsDownload(false); try { HWSClientThread.setConfiguration($"{_HighwayStorageDataUrl}/Service.asmx", "", "888888", "", "", "", "", 50, 1); HWSClientThread.setConfigThread(HWSConfigThread); } catch (Exception ex) { TransResultBeginInvoke(DateTime.Now, "普通业务数据上传配置失败:" + ex.Message); Transmission.SDK.LogHelper.WriteServiceLog("普通业务数据上传配置失败:" + ex.Message); } return true; } #endregion #region 方法 -> 交易业务数据上传配置 /// /// 交易业务数据上传配置 /// private bool HWSDConfigThreadConfigure() { string _HighwaySellDataUrl; try { _HighwaySellDataUrl = ConfigurationManager.AppSettings["HighwaySellDataUrl"]; } catch { _HighwaySellDataUrl = ""; } if (string.IsNullOrWhiteSpace(_HighwaySellDataUrl)) { TransResultBeginInvoke(DateTime.Now, $"普通业务数据上传线程启动失败。原因:参数[HighwaySellDataUrl]未配置。"); return false; } if (HWSDConfigThread == null) { HWSDConfigThread = new ConfigThread(""); } HWSDClientThread.IsUpload(true, new List { "T_DAILYMOBILEPAY" }); HWSDClientThread.IsDownload(false); try { HWSDClientThread.setConfiguration($"{_HighwaySellDataUrl}/Service.asmx", "", "888888", "", "", "", "", 50, 1); HWSDClientThread.setConfigThread(HWSDConfigThread); } catch (Exception ex) { TransResultBeginInvoke(DateTime.Now, "交易业务数据上传配置失败:" + ex.Message); Transmission.SDK.LogHelper.WriteServiceLog("交易业务数据上传配置失败:" + ex.Message); } return true; } #endregion #region 方法 -> 移动业务数据上传配置 /// /// 移动业务数据上传配置 /// private bool MSPConfigThreadConfigure() { string _MobileServicePlatformDataUrl; try { _MobileServicePlatformDataUrl = ConfigurationManager.AppSettings["MobileServicePlatformDataUrl"]; } catch { _MobileServicePlatformDataUrl = ""; } if (string.IsNullOrWhiteSpace(_MobileServicePlatformDataUrl)) { TransResultBeginInvoke(DateTime.Now, $"移动业务数据上传线程启动失败。原因:参数[MobileServicePlatformDataUrl]未配置。"); return false; } if (MSPConfigThread == null) { MSPConfigThread = new ConfigThread(""); } MSPClientThread.IsUpload(true, new List { "T_SERVERPART", "T_SERVERPARTSHOP" }); MSPClientThread.IsDownload(false); try { MSPClientThread.setConfiguration($"{_MobileServicePlatformDataUrl}/Service.asmx", "", "888888", "", "", "", "", 50, 1); MSPClientThread.setConfigThread(MSPConfigThread); } catch (Exception ex) { TransResultBeginInvoke(DateTime.Now, "移动业务数据上传配置失败:" + ex.Message); Transmission.SDK.LogHelper.WriteServiceLog("移动业务数据上传配置失败:" + ex.Message); } return true; } #endregion #region 方法 -> 数据版本反馈上传配置 /// /// 数据版本反馈上传配置 /// private bool CMFBConfigThreadConfigure() { string _GeneralFeedBackDataUrl; try { _GeneralFeedBackDataUrl = ConfigurationManager.AppSettings["GeneralFeedBackDataUrl"]; } catch { _GeneralFeedBackDataUrl = ""; } if (string.IsNullOrWhiteSpace(_GeneralFeedBackDataUrl)) { TransResultBeginInvoke(DateTime.Now, $"数据版本反馈上传线程启动失败。原因:参数[GeneralFeedBackDataUrl]未配置。"); return false; } if (CMFBConfigThread == null) { CMFBConfigThread = new ConfigThread(""); } CMFBClientThread.IsUpload(true, new List { "T_GENERALFEEDBACK" }); CMFBClientThread.IsDownload(false); try { CMFBClientThread.setConfiguration($"{_GeneralFeedBackDataUrl}/Service.asmx", "", "888888", "", "", "", "", 50, 1); CMFBClientThread.setConfigThread(CMFBConfigThread); } catch (Exception ex) { TransResultBeginInvoke(DateTime.Now, "数据版本反馈上传配置失败:" + ex.Message); Transmission.SDK.LogHelper.WriteServiceLog("数据版本反馈上传配置失败:" + ex.Message); } return true; } #endregion #region 事件 -> 上传回调事件 /// /// 上传回调事件 /// /// /// private void ClientThread_UploadStringEvent(UploadResultInfo uploadResultInfo, string resultString) { if (uploadResultInfo.StartToEnd) { TransResultBeginInvoke(DateTime.Now, resultString); } else { TransResultBeginInvoke(DateTime.Now, string.Format("上传完成:[{0}]\n     总数:{1};成功:{2};过滤:{3};失败:{5};耗时:{4}{6}", uploadResultInfo.TableName, uploadResultInfo.TotalNumber, uploadResultInfo.SuccessNumber, uploadResultInfo.FilterNumber, uploadResultInfo.Elapsed.TotalSeconds.ToString("F2") + "秒", uploadResultInfo.TotalNumber - uploadResultInfo.SuccessNumber - uploadResultInfo.FilterNumber, (string.IsNullOrWhiteSpace(uploadResultInfo.InterfaceError) ? "" : (";\n     接口错误:" + uploadResultInfo.InterfaceError)) + (string.IsNullOrWhiteSpace(uploadResultInfo.Error) ? "" : (";\n     本地错误:" + uploadResultInfo.Error)))); if (!string.IsNullOrWhiteSpace(uploadResultInfo.InterfaceError) || !string.IsNullOrWhiteSpace(uploadResultInfo.Error)) { Transmission.SDK.LogHelper.WriteServiceLog(string.Format("上传完成:[{0}]总数:{1};成功:{2};过滤:{3};失败:{5};耗时:{4}{6}", uploadResultInfo.TableName, uploadResultInfo.TotalNumber, uploadResultInfo.SuccessNumber, uploadResultInfo.FilterNumber, uploadResultInfo.Elapsed.TotalSeconds.ToString("F2") + "秒", uploadResultInfo.TotalNumber - uploadResultInfo.SuccessNumber - uploadResultInfo.FilterNumber, (string.IsNullOrWhiteSpace(uploadResultInfo.InterfaceError) ? "" : (";接口错误:" + uploadResultInfo.InterfaceError)) + (string.IsNullOrWhiteSpace(uploadResultInfo.Error) ? "" : (";本地错误:" + uploadResultInfo.Error)))); } } } #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) { if (TransResultTable == null) { TransResultTable = ResultTable(); } foreach (DataRow _RowTemp in TransResultTable.Select(string.Format("TransDate < '{0}'", DateTime.Now.AddHours(-1)))) { TransResultTable.Rows.Remove(_RowTemp); } TransResultTable.AcceptChanges(); DataRow _DataRow = TransResultTable.NewRow(); _DataRow["TransDate"] = triggerTime; _DataRow["TransResult"] = resultMessage; TransResultTable.Rows.InsertAt(_DataRow, 0); DataTransResult.AutoGenerateColumns = false; DataTransResult.SelectionMode = DataGridSelectionMode.Single; DataTransResult.ItemsSource = TransResultTable.DefaultView; } /// /// 运行日志记录表结构 /// /// private DataTable ResultTable() { DataTable _DataTable = new DataTable(); _DataTable.Columns.Add("TransDate", typeof(DateTime)); _DataTable.Columns.Add("TransResult", typeof(string)); return _DataTable; } #endregion } }