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);
}
}
}
}
}