using System; using System.Collections.Generic; using System.Data; using System.Globalization; using System.Linq; using System.Net; using System.Net.Sockets; 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 ConnectPoint { /// /// MainWindow.xaml 的交互逻辑 /// public partial class MainWindow : Window { /// /// 状态反馈主定时器 /// readonly DispatcherTimer WorkerTimer; /// /// 数据传输接口地址 /// string WebServiceUrl { get; set; } /// /// 主支付通道接口地址 /// string PayServiceUrl { get; set; } /// /// 数据传输线程类 /// GetHttpData.SDK.ThreadPool.ClientThread DataClientThread { get; set; } public MainWindow() { InitializeComponent(); WorkerTimer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(60) }; WorkerTimer.Tick += WorkerTimer_Tick; WorkerTimer.Start(); } /// /// 主程序启动加载事件 /// /// /// private void Window_Loaded(object sender, RoutedEventArgs e) { #region 程序启动时,进行过期日志、备份文件清理操作并升级本地表结构 new Thread(() => { int _FileCount = 0; //清理程序根目录下过期日志文件 try { ESSupport.Lib.FileHelper.DeleteFiles(AppDomain.CurrentDomain.BaseDirectory, new string[] { ".log" }, false, false, 10, ref _FileCount); } catch { } //清理错误日志文件夹中过期日志文件 try { ESSupport.Lib.FileHelper.DeleteFiles(AppDomain.CurrentDomain.BaseDirectory + "\\log", new string[] { ".log" }, false, false, 10, ref _FileCount); } catch { } //清理流水日志文件 try { ESSupport.Lib.FileHelper.DeleteFiles(AppDomain.CurrentDomain.BaseDirectory + "\\selldata", new string[] { ".log" }, false, false, 60, ref _FileCount); } catch { } //升级本地数据库表结构 try { ESSupport.Lib.DataBaseUpdate.PosDataBaseUpdate(); } catch { } //清理过期备份数据文件 try { ESSupport.Lib.DataBaseUpdate.ClearDataBackup(AppDomain.CurrentDomain.BaseDirectory + "\\DataBackup", 60, true); } catch { } try { ESSupport.Lib.DataBaseUpdate.ClearCustomerInfo(AppDomain.CurrentDomain.BaseDirectory + "\\CustomerInfo", 7); } catch { } try { //获取服务区编码 string _ServerPartCode = ESSupport.Pos.PosConfigInit.ConfigurationValues("serverpartcode", string.Empty); //获取门店编码 string _ShopCode = ESSupport.Pos.PosConfigInit.ConfigurationValues("shopcode", string.Empty); //获取数据保留时长 int _EffectiveDay = int.Parse(ESSupport.Pos.PosConfigInit.ConfigurationValues("effective_day", "60")); //获取门店ID string _ServerPartShopID = ESSupport.Lib.SyBaseHelper.QueryOdbc( $@"SELECT SERVERPARTSHOP_ID FROM T_SHOPMESSAGE WHERE SERVERPARTCODE = '{_ServerPartCode}' AND SHOPCODE = '{_ShopCode}'").Tables[0].Rows[0]["SERVERPARTSHOP_ID"].ToString(); //清理历史过期数据 ESSupport.Lib.DataBaseUpdate.ClearData(_ServerPartCode, _ShopCode, _ServerPartShopID, _EffectiveDay); } catch { } }) { IsBackground = true }.Start(); this.Hide(); try { //启动时删除重复商品条码,并设置重新获取商品数据 ESSupport.Lib.SyBaseHelper.ExecuteSqlTran( @"DELETE FROM T_COMMODITYEX B WHERE B.ISVALID = 0 AND B.COMMODITY_BARCODE IN( SELECT A.COMMODITY_BARCODE FROM T_COMMODITYEX A --WHERE A.ISVALID = 1 GROUP BY A.SERVERPARTCODE,A.COMMODITY_BARCODE HAVING COUNT(COMMODITY_BARCODE) > 1)"); ESSupport.Lib.SyBaseHelper.ExecuteSqlTran("DELETE FROM T_DOWNUPDATE"); } catch { } //程序启动时立即上报一次心跳数据,解决PB版本收银系统结账后立即关机导致版本信息未回传至服务器的问题 try { if (ESSupport.Common.PosControl.StateFeedbackThread == null || !ESSupport.Common.PosControl.StateFeedbackThread.IsAlive) { ESSupport.Common.PosControl.StateFeedbackThread = new Thread(() => { ESSupport.Pos.ThreadHelper.StateFeedbackUpload($"http://{ESSupport.Pos.PosConfigInit.ConfigurationValues("server_ip", string.Empty)}:" + $"{ESSupport.Pos.PosConfigInit.ConfigurationValues("DataServicePort", "7080")}/DataServices/Service.asmx"); }) { IsBackground = true }; ESSupport.Common.PosControl.StateFeedbackThread.Start(); } } catch { } try { //获取服务区编码 string _ServerPartCode = ESSupport.Pos.PosConfigInit.ConfigurationValues("serverpartcode", string.Empty); //获取门店编码 string _ShopCode = ESSupport.Pos.PosConfigInit.ConfigurationValues("shopcode", string.Empty); //h获取收银机号 string _MachineCode = ESSupport.Pos.PosConfigInit.ConfigurationValues("machinecode", string.Empty); if (!string.IsNullOrWhiteSpace(_ServerPartCode) && !string.IsNullOrWhiteSpace(_ShopCode) && !string.IsNullOrWhiteSpace(_MachineCode)) { if (DataClientThread == null) { DataClientThread = new GetHttpData.SDK.ThreadPool.ClientThread(); } Common.ConfigThread _ConfigThread = new Common.ConfigThread(_ServerPartCode); DataClientThread.setConfiguration($"http://{ESSupport.Pos.PosConfigInit.ConfigurationValues("server_ip", string.Empty)}:" + $"{ESSupport.Pos.PosConfigInit.ConfigurationValues("DataServicePort", "7080")}/DataServices/Service.asmx", ESSupport.Pos.PosConfigInit.ConfigurationValues("authorization", string.Empty), _ServerPartCode, "", _ShopCode, ESSupport.Lib.PCHelper.GetMacAddressByNetworkInformation(), _MachineCode, 400, 15, 20); switch (ESSupport.Pos.PosConfigInit.ConfigurationValues("ProvinceCode", "330000")) { //使用旧数据源下发数据的业主单位 case "140000": case "330200": case "330300": case "450000": case "500000": case "510000": DataClientThread.IsDownload(true, new List() { "T_SELLWORKER", "T_SHOPMESSAGE", "T_CONFIGURATION" }); break; //使用新数据源下发数据的业主单位 case "330000": case "451200": case "520000": case "620000": case "650000": default: DataClientThread.IsDownload(true, new List() { "T_SELLWORKER_UNIT", "T_SELLWORKER_CLOUD", "T_SHOPMESSAGE_EX", "T_CONFIGURATION" }); break; } DataClientThread.IsUpload(true, new List { "T_ENDACCOUNT", "T_ENDACCOUNT_NEW", "T_PERSONSELL", "T_PERSONSELL_NEW", "T_COMMODITYSALE", "T_COMMODITYSALE_NEW", "T_TRANSFER_SALE", "T_MOBILE_PAY" }); DataClientThread.setConfigThread(_ConfigThread); DataClientThread.DownloadStringEvent += new GetHttpData.SDK.ThreadPool.ClientThread.OutputResultsDownArg(DownStringEvent);//监听下载事件 DataClientThread.UploadStringEvent += new GetHttpData.SDK.ThreadPool.ClientThread.OutputResultsUploadArg(UploadStringEvent); DataClientThread.onState(); } } catch { } #endregion } /// /// 数据下载监听事件 /// /// /// private void DownStringEvent(GetHttpData.SDK.ThreadPool.DownResultInfo downResultInfo, string resultString) { } /// /// 数据上传监听事件 /// /// /// private void UploadStringEvent(GetHttpData.SDK.ThreadPool.UploadResultInfo uploadResultInfo, string resultString) { } /// /// 主定时器运行事件 /// /// /// private void WorkerTimer_Tick(object sender, EventArgs e) { //初始化数据传输接口地址 if (string.IsNullOrWhiteSpace(WebServiceUrl) || (DateTime.Now - ESSupport.Common.PosControl.DataCollectionTime).Minutes % 10 == 0) { string _ServiceUrl = $"http://{ESSupport.Pos.PosConfigInit.ConfigurationValues("server_ip", string.Empty)}:" + $"{ESSupport.Pos.PosConfigInit.ConfigurationValues("DataServicePort", "7080")}/DataServices/Service.asmx"; //检查主数据传输接口是否可以正常访问,不能正常访问的话,使用备用接口 if (ESSupport.Lib.HttpHelper.UrlIsExist(_ServiceUrl)) { WebServiceUrl = _ServiceUrl; } else { WebServiceUrl = $"http://{ESSupport.Pos.PosConfigInit.ConfigurationValues("server_ip", string.Empty)}:" + $"{ESSupport.Pos.PosConfigInit.ConfigurationValues("service_port", "7080")}/Service.asmx"; } } //初始化移动支付交易检测接口地址 if (string.IsNullOrWhiteSpace(PayServiceUrl)) { PayServiceUrl = $"http://{ESSupport.Pos.PosConfigInit.ConfigurationValues("server_ip", string.Empty)}:" + $"{ESSupport.Pos.PosConfigInit.ConfigurationValues("service_port", "7080")}/Service.asmx"; } //设置十分钟统计启动时间 if (ESSupport.Common.PosControl.DataCollectionTime == DateTime.MinValue) { ESSupport.Common.PosControl.DataCollectionTime = DateTime.Now.AddMilliseconds(-Environment.TickCount); } //收银机指令执行线程 if (ESSupport.Common.PosControl.CommodityMachineThread == null || !ESSupport.Common.PosControl.CommodityMachineThread.IsAlive) { ESSupport.Common.PosControl.CommodityMachineThread = new Thread(() => { ESSupport.Pos.ThreadHelper.CommodityMachine(WebServiceUrl); ESSupport.Pos.ThreadHelper.InstructionExecute(WebServiceUrl); ESSupport.Pos.ThreadHelper.License(); }) { IsBackground = true }; ESSupport.Common.PosControl.CommodityMachineThread.Start(); } //启动运行日志记录线程 if (ESSupport.Common.PosControl.RuningLogThread == null || !ESSupport.Common.PosControl.RuningLogThread.IsAlive) { ESSupport.Common.PosControl.RuningLogThread = new Thread(() => { if (ESSupport.Pos.ThreadHelper.RuningLog(ESSupport.Common.PosControl.RuningTime)) { ESSupport.Common.PosControl.RuningTime = DateTime.Now; } }) { IsBackground = true }; ESSupport.Common.PosControl.RuningLogThread.Start(); } //定时启动实时交易统计线程 if (!ESSupport.Common.PosControl.DataCollectionRun && (DateTime.Now - ESSupport.Common.PosControl.DataCollectionTime).Minutes % 10 == 0) { if (ESSupport.Common.PosControl.DataCollectionThread == null || !ESSupport.Common.PosControl.DataCollectionThread.IsAlive) { ESSupport.Common.PosControl.DataCollectionThread = new Thread(() => { ESSupport.Common.PosControl.DataCollectionRun = true; ESSupport.Pos.ThreadHelper.DataCollectionUpload(WebServiceUrl); ESSupport.Pos.ThreadHelper.NewSystemConfig(); }) { IsBackground = true }; ESSupport.Common.PosControl.DataCollectionThread.Start(); //Common.PosControl.DataCollectionTime = DateTime.Now.AddMinutes(10); } } if (ESSupport.Common.PosControl.DataCollectionRun && (DateTime.Now - ESSupport.Common.PosControl.DataCollectionTime).Minutes % 10 != 0) { ESSupport.Common.PosControl.DataCollectionRun = false; } //定时启动移动支付交易校验、配置下发线程 if (DateTime.Now > ESSupport.Common.PosControl.MobilePayCheckTime) { if (ESSupport.Common.PosControl.MobilePayCheckThread == null || !ESSupport.Common.PosControl.MobilePayCheckThread.IsAlive) { ESSupport.Common.PosControl.MobilePayCheckThread = new Thread(() => { ESSupport.Pos.ThreadHelper.MobilePayCheck(PayServiceUrl, DateTime.Today.AddDays(-1)); ESSupport.Pos.ThreadHelper.MobilePayConfigUpdate(ESSupport.Pos.PosConfigInit.ConfigurationValues("server_ip", string.Empty)); ESSupport.Pos.ThreadHelper.MobilePayQueryCheck(PayServiceUrl, DateTime.Today.AddMinutes(-10)); }) { IsBackground = true }; ESSupport.Common.PosControl.MobilePayCheckThread.Start(); ESSupport.Common.PosControl.MobilePayCheckTime = DateTime.Now.AddMinutes(10); } } //定时启动状态反馈线程 if (DateTime.Now > ESSupport.Common.PosControl.StateFeedBackTime) { if (ESSupport.Common.PosControl.StateFeedbackThread == null || !ESSupport.Common.PosControl.StateFeedbackThread.IsAlive) { ESSupport.Common.PosControl.StateFeedbackThread = new Thread(() => { ESSupport.Pos.ThreadHelper.StateFeedbackUpload(WebServiceUrl); }) { IsBackground = true }; ESSupport.Common.PosControl.StateFeedbackThread.Start(); ESSupport.Common.PosControl.StateFeedBackTime = DateTime.Now.AddMinutes(1); } } //启动基础数据版本上报线程 if (DateTime.Now > ESSupport.Common.PosControl.BaseInfoFeedbackTime) { if (ESSupport.Common.PosControl.BaseInfoFeedbackThread == null || !ESSupport.Common.PosControl.BaseInfoFeedbackThread.IsAlive) { ESSupport.Common.PosControl.BaseInfoFeedbackThread = new Thread(() => { //基础数据版本接口上报 ESSupport.Pos.ThreadHelper.BaseInfoFeedbackUpload(WebServiceUrl); //收银机器信息接口上报 ESSupport.Pos.ThreadHelper.MachineInfoFeedbackUpload(WebServiceUrl); try { //读取后台配置的更新服务地址 string _UpdateIP = ESSupport.Pos.PosConfigInit.ConfigurationValues("UpdateIP", string.Empty); if (string.IsNullOrWhiteSpace(_UpdateIP)) { //更新服务地址未配置时,默认同收银服务器地址 _UpdateIP = ESSupport.Pos.PosConfigInit.ConfigurationValues("server_ip", string.Empty); } //读取后台配置的更新服务端口,默认:11000 string _UpdatePort = ESSupport.Pos.PosConfigInit.ConfigurationValues("UpdatePort", "11000"); if (!string.IsNullOrWhiteSpace(_UpdateIP) && !string.IsNullOrWhiteSpace(_UpdatePort)) { //检测更新站点是否存在,存在则更新配置文件 if (ESSupport.Lib.HttpHelper.UrlIsExist($"http://{_UpdateIP}:{_UpdatePort}/Update.asmx")) { //修改更新服务IP地址 if (ESSupport.Lib.ConfigHelper.GetAppConfig(AppDomain.CurrentDomain.BaseDirectory + "\\update.xml", "IP") != _UpdateIP) { ESSupport.Lib.ConfigHelper.UpdateAppConfig(AppDomain.CurrentDomain.BaseDirectory + "\\update.xml", "IP", _UpdateIP); } //修改更新服务端口 if (ESSupport.Lib.ConfigHelper.GetAppConfig(AppDomain.CurrentDomain.BaseDirectory + "\\update.xml", "Port") != _UpdatePort) { ESSupport.Lib.ConfigHelper.UpdateAppConfig(AppDomain.CurrentDomain.BaseDirectory + "\\update.xml", "Port", _UpdatePort); } } } //更新配置文件不存在端口号配置项时,写入默认端口 if (string.IsNullOrWhiteSpace(ESSupport.Lib.ConfigHelper.GetAppConfig(AppDomain.CurrentDomain.BaseDirectory + "\\update.xml", "Port"))) { ESSupport.Lib.ConfigHelper.UpdateAppConfig(AppDomain.CurrentDomain.BaseDirectory + "\\update.xml", "Port", "11000"); } } catch { } try { //删除待生效商品表中已生效的商品数据 ESSupport.Lib.SyBaseHelper.ExecuteSqlTran( @"DELETE FROM T_COMMODITYEX_INEFFECTIVE A WHERE EXISTS(SELECT 1 FROM T_COMMODITYEX B WHERE A.SERVERPARTCODE = B.SERVERPARTCODE AND A.COMMODITY_BARCODE = B.COMMODITY_BARCODE AND A.COMMODITY_CODE = B.COMMODITY_CODE AND A.SERVERPARTSHOP_ID = B.SERVERPARTSHOP_ID AND A.DOWNLOADDATE <= B.DOWNLOADDATE)"); //将待生效商品表中已生效商品更新至正式商品表中 ESSupport.Lib.SyBaseHelper.ExecuteSqlTran( @"UPDATE T_COMMODITYEX A SET A.COMMODITY_TYPE = B.COMMODITY_TYPE, A.COMMODITY_NAME = B.COMMODITY_NAME, A.COMMODITY_RULE = B.COMMODITY_RULE, A.COMMODITY_UNIT = B.COMMODITY_UNIT, A.COMMODITY_RETAILPRICE = B.COMMODITY_RETAILPRICE, A.COMMODITY_MEMBERPRICE = B.COMMODITY_MEMBERPRICE, A.CANCHANGEPRICE = B.CANCHANGEPRICE,A.ISVALID = B.ISVALID, A.COMMODITY_EN = B.COMMODITY_EN,A.ISBULK = B.ISBULK, A.METERINGMETHOD = B.METERINGMETHOD, A.DOWNLOADDATE = B.DOWNLOADDATE,A.FLAG = B.FLAG, A.COMMODITY_SYMBOL = B.COMMODITY_SYMBOL, A.COMMODITY_HOTKEY = B.COMMODITY_HOTKEY, A.USERDEFINEDTYPE_ID = B.USERDEFINEDTYPE_ID, A.REMINDER_DAY = B.REMINDER_DAY, A.GUARANTEE_DAY = B.GUARANTEE_DAY, A.COMMODITY_TYPECODE = B.COMMODITY_TYPECODE FROM T_COMMODITYEX_INEFFECTIVE B WHERE A.SERVERPARTCODE = B.SERVERPARTCODE AND A.COMMODITY_CODE = B.COMMODITY_CODE AND A.COMMODITY_BARCODE = B.COMMODITY_BARCODE AND A.SERVERPARTSHOP_ID = B.SERVERPARTSHOP_ID AND A.DOWNLOADDATE < B.DOWNLOADDATE AND B.DOWNLOADDATE < TODAY() + 1"); //将待生效商品表中已生效的商品插入正式商品表 ESSupport.Lib.SyBaseHelper.ExecuteSqlTran( @"INSERT INTO T_COMMODITYEX (COMMODITYEX_ID, SERVERPARTCODE,COMMODITY_TYPE,COMMODITY_CODE, COMMODITY_BARCODE,COMMODITY_NAME,COMMODITY_RULE, COMMODITY_UNIT,COMMODITY_RETAILPRICE, COMMODITY_MEMBERPRICE,CANCHANGEPRICE, ISVALID,COMMODITY_EN,ISBULK,METERINGMETHOD, DOWNLOADDATE,FLAG,BUSINESSTYPE,SERVERPARTSHOP_ID, PRINT_DATE,CONTAINER_CODE,COMMODITY_SYMBOL, COMMODITY_HOTKEY,USERDEFINEDTYPE_ID, TRANSFER_STATE,REMINDER_DAY,GUARANTEE_DAY, COMMODITY_TYPECODE) SELECT A.COMMODITYEX_ID,A.SERVERPARTCODE, A.COMMODITY_TYPE,A.COMMODITY_CODE, A.COMMODITY_BARCODE,A.COMMODITY_NAME, A.COMMODITY_RULE,A.COMMODITY_UNIT, A.COMMODITY_RETAILPRICE,A.COMMODITY_MEMBERPRICE, A.CANCHANGEPRICE,A.ISVALID,A.COMMODITY_EN, A.ISBULK,A.METERINGMETHOD,A.DOWNLOADDATE, A.FLAG,A.BUSINESSTYPE,A.SERVERPARTSHOP_ID, A.PRINT_DATE,A.CONTAINER_CODE,A.COMMODITY_SYMBOL, A.COMMODITY_HOTKEY,A.USERDEFINEDTYPE_ID, A.TRANSFER_STATE,A.REMINDER_DAY, A.GUARANTEE_DAY,A.COMMODITY_TYPECODE FROM T_COMMODITYEX_INEFFECTIVE A WHERE A.DOWNLOADDATE < TODAY() + 1 AND NOT EXISTS (SELECT 1 FROM T_COMMODITYEX B WHERE A.SERVERPARTCODE = B.SERVERPARTCODE AND A.COMMODITY_BARCODE = B.COMMODITY_BARCODE AND A.COMMODITY_CODE = B.COMMODITY_CODE AND A.SERVERPARTSHOP_ID = B.SERVERPARTSHOP_ID )"); } catch { } }) { IsBackground = true }; ESSupport.Common.PosControl.BaseInfoFeedbackThread.Start(); ESSupport.Common.PosControl.BaseInfoFeedbackTime = DateTime.Now.AddMinutes(30); } } } } }