using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Linq; using System.Text; 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; namespace PosDataTest { /// /// MainWindow.xaml 的交互逻辑 /// public partial class MainWindow : Window { #region 属性 /// /// 账期唯一标识编码 /// public string EndAccountCode { get; set; } /// /// 账期开始时间 /// public DateTime EndAccountStartDate { get; set; } /// /// 商品信息清单 /// List CommodityModelList { get; set; } /// /// 数据下载线程 /// System.Threading.Thread PosDataDownloadThread { get; set; } /// /// 模拟交易数据添加线程 /// System.Threading.Thread AddDataThread { get; set; } /// /// Socket客户端批量执行线程 /// System.Threading.Thread SocketThread { get; set; } /// /// 数据下载实例 /// ESSupport.Transfer.PosDataDownload DataDownload { get; set; } ESSupport.Transfer.PosDataUpload DataUpload { get; set; } /// /// Socket客户端列表 /// System.Collections.Concurrent.ConcurrentDictionary PosSocketList { get; set; } /// /// 界面日志记录 /// System.Collections.ObjectModel.ObservableCollection TransResultTable { get; set; } #endregion /// /// Socket客户端模拟连接身份标识信息 /// private class SocketConnectInfo { public string ServerpartCode { get; set; } public string ShopCode { get; set; } public string MachineCode { get; set; } } public MainWindow() { InitializeComponent(); if (string.IsNullOrWhiteSpace(EndAccountCode)) { Sales.IsEnabled = false; EndAccount.IsEnabled = false; } } #region 模拟收银机登录及初始化 /// /// 登录及初始化 /// /// /// private void Login_Click(object sender, RoutedEventArgs e) { QualityHelper.GetConfiguration(); ESSupport.Lib.LogHelper.WriteServiceLog("正在通过云端接口获取服务区门店对应业主参数配置。"); //通过云端接口获取当前服务区门店对应的业主参数配置(软件名称、扫码上传数据地址、业主单位名称、业主单位ID标识) //ESSupport.Pos.ThreadHelper.ConfigurationByCloud($"http://{QualityHelper.dbip}:{QualityHelper.serviceport}/Service.asmx"); //数据上传实例化 DataUpload = new ESSupport.Transfer.PosDataUpload(QualityHelper.serverpartcode, QualityHelper.shopcode, QualityHelper.machinecode, "10.103.1.8", "8001"); DataUpload.NotifyEvent += DataUpload_NotifyEvent; //数据下发实例化 DataDownload = new ESSupport.Transfer.PosDataDownload(QualityHelper.serverpartcode, QualityHelper.shopcode, QualityHelper.machinecode, "pos.eshangtech.com", "8900"); DataDownload.NotifyEvent += DataDownload_NotifyEvent; QualityHelper.sellworkercode = "0001"; int int_Result = PersonLogin("0001", out string sellWorkerCode); if (int_Result == 0) { Sales.IsEnabled = true; EndAccount.IsEnabled = true; dp_Start.IsEnabled = false; ((Button)sender).Content = "登录成功"; } else { MessageBox.Show($"登录失败,原因:{int_Result}"); } } #endregion #region 批量模拟机器Socket通讯 /// /// 消息通知服务控制 /// /// /// private void Socket_Click(object sender, RoutedEventArgs e) { if (PosSocketList == null) { //初始化Socket客户端列表 PosSocketList = new System.Collections.Concurrent.ConcurrentDictionary(); } #region Socket客户端机器列表 List list_SocketConnect = new List(); list_SocketConnect.Add(new SocketConnectInfo() { ServerpartCode = "888888", ShopCode = "042002", MachineCode = "9999" }); #endregion #region 初始化Socket客户端 for (int i = 0; i < list_SocketConnect.Count; i++) { // if (!PosSocketList.ContainsKey(list_SocketConnect[i].ServerpartCode + list_SocketConnect[i].ShopCode + list_SocketConnect[i].MachineCode)) { ESSupport.Transfer.PosSuperSocketClient _SocketClient = new ESSupport.Transfer.PosSuperSocketClient( $"ws://10.103.1.8:7199/?ServerpartCode={list_SocketConnect[i].ServerpartCode}&ShopCode={list_SocketConnect[i].ShopCode}&MachineCode={list_SocketConnect[i].MachineCode}", list_SocketConnect[i].ServerpartCode, list_SocketConnect[i].ShopCode, list_SocketConnect[i].MachineCode, "10.103.1.8", "8001"); _SocketClient.NotifyEvent += PosSocket_NotifyEvent; PosSocketList.TryAdd(list_SocketConnect[i].ServerpartCode + list_SocketConnect[i].ShopCode + list_SocketConnect[i].MachineCode, _SocketClient); } } #endregion #region Socket客户端连接启动线程 new System.Threading.Thread(() => { foreach (KeyValuePair item in PosSocketList) { if (!item.Value.ClientRuning) { item.Value.Start(); } } }) { IsBackground = true }.Start(); #endregion #region 界面在线数量显示统计线程 if (SocketThread == null || !SocketThread.IsAlive) { SocketThread = new System.Threading.Thread(() => { do { int int_Online = 0; if (PosSocketList.Count > 0) { int_Online = PosSocketList.Values.Where(p => p.SocketState == 1).Count(); } Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, (System.Threading.ThreadStart)delegate { //要执行的代码 txtSocketMessage.Text = $"收银机总数:{PosSocketList.Count};当前在线数:{int_Online}"; }); System.Threading.Thread.Sleep(5 * 1000); } while (true); }) { IsBackground = true }; SocketThread.Start(); } #endregion } #endregion #region 模拟添加流水数据 /// /// 添加交易流水 /// /// /// private void Sales_Click(object sender, RoutedEventArgs e) { if (AddDataThread == null || !AddDataThread.IsAlive) { AddDataThread = new System.Threading.Thread(() => { int int_AddCount = new Random(Guid.NewGuid().GetHashCode()).Next(1, 20); for (int i = 0; i < int_AddCount; i++) { TransResultBeginInvoke(DateTime.Now, $"正在添加第{i + 1}条数据,共{int_AddCount}条。"); DateTime time_MasterTime = ESSupport.Method.DateTimeExtend.GetRandomTime(dp_Start.DateTime, dp_End.DateTime); AddSellData(time_MasterTime); AddException(new Random(Guid.NewGuid().GetHashCode()).Next(1, 100), time_MasterTime); } }) { IsBackground = true }; AddDataThread.Start(); } } #endregion #region 模拟上传压缩文件 private void DataFileUpload_Click(object sender, RoutedEventArgs e) { foreach (KeyValuePair item in PosSocketList) { if (!item.Value.ClientRuning) { item.Value.Start(); System.Threading.Thread.Sleep(1000); } item.Value.SendSocketMsg(ESSupport.Transfer.TransferDataDictionary.TableDataType.UploadZipFile); } //DataFileUp(); } #endregion #region 模拟日结交班 /// /// 模拟日结交班 /// /// /// private void EndAccount_Click(object sender, RoutedEventArgs e) { if (dp_End.DateTime < dp_Start.DateTime) { TransResultBeginInvoke(DateTime.Now, $"结账失败,原因:账期结束时间小于账期开始时间。"); return; } int int_AddCount = new Random(Guid.NewGuid().GetHashCode()).Next(1, 10000); CreateNaturalDay(dp_End.DateTime); if (Prints.CheckOutData(int_AddCount, "9001", dp_End.DateTime)) { TransResultBeginInvoke(DateTime.Now, $"结账成功。缴款金额:{int_AddCount}"); //MessageBox.Show($"结账成功。缴款金额:{int_AddCount}"); Login.Content = "登录系统"; EndAccountCode = ""; Sales.IsEnabled = false; EndAccount.IsEnabled = false; dp_Start.IsEnabled = true; } else { TransResultBeginInvoke(DateTime.Now, $"结账失败,原因:请查阅Log文件。缴款金额:{int_AddCount}"); //MessageBox.Show($"结账失败,原因:请查阅Log文件。缴款金额:{int_AddCount}"); } } #endregion #region 模拟数据初始化下载 /// /// 模拟数据初始化下载 /// /// /// private void Shop_Click(object sender, RoutedEventArgs e) { new System.Threading.Thread(() => { try { string str_SQL = $@"SELECT B.COMMODITYSALE_ID AS COMMODITYSALE_ID, A.STARTDATE,A.ENDDATE,A.SERVERPARTCODE,A.SHOPCODE, A.MACHINECODE,B.COMMODITY_TYPE,B.COMMODITY_CODE, B.COMMODITY_BARCODE,B.COMMODITY_NAME, B.TICKTE_COUNT AS TICKETCOUNT,B.TOTAL_COUNT AS TOTALCOUNT, B.TOTAL_AMOUNT AS TOTALSELLAMOUNT, B.TOTAL_OFFAMOUNT AS TOTALOFFAMOUNT FROM T_ENDACCOUNT_NEW A,T_COMMODITYSALE_NEW B WHERE A.ENDACCOUNT_CODE = B.ENDACCOUNT_CODE AND A.ENDACCOUNT_CODE = '620701032001351120211010181533267167'"; //str_SQL = $@"UPDATE T_DATAFILEUPLOAD SET DATAFILEUPLOAD_STATE = 0 // WHERE DATAFILEUPLOAD_NAME = '620031032001356520211010152724_EndAccount.zip'"; //str_SQL = "SELECT * FROM T_DATAFILEUPLOAD"; string str_Serverpart = "620701032001"; //str_Serverpart = "515320131201,515320012201,515320032201,515320111201,515320013002,515320033002"; str_SQL = "DELETE FROM t_shopmessage WHERE serverpartshop_id < 1000 AND serverpartcode LIKE '51%'"; str_SQL = ""; str_Serverpart = "510100000000,510101000000,510102000000,510200000000,510300000000,510400000000,510402000000,510403000000,510404000000,510405000000,510406000000,510407000000,510500000000,510501000000,510502000000,510600000000,510700000000,510800000000,510900000000,511000000000,511100000000,511200000000,511300000000,511400000000,511500000000,511600000000,511700000000,511800000000,511900000000,511910000000,512100000000,512200000000,512800000000,512910000000,513100000000,513210000000,515001000000,515200000000,515300000000,515310000000,515320000000,515400000000"; //List list_TableName = new List() { "1", "2", "3", "4", "5", "6", "8", "20", "21", "10" }; //str_SQL = $@"SELECT * FROM T_CONFIGURATION "; //str_SQL = $@"UPDATE T_CONFIGURATION // SET CONFIGURATION_VALUES = '7083', // CONFIGURATION_DATE = NOW() // WHERE UPPER(CONFIGURATION_NAME) = UPPER('DataServicePort')"; //str_SQL = $@"INSERT INTO T_CONFIGURATION (CONFIGURATION_ID, // CONFIGURATION_DATE,CONFIGURATION_NAME,CONFIGURATION_VALUES) // VALUES({ESSupport.DataStorage.DataFunction.CreateNextSequence("T_CONFIGURATION", "CONFIGURATION_ID")}, // NOW(),'UpdatePort','11001')"; //str_SQL = $"SELECT * FROM T_DATAFILEUPLOAD WHERE DATAFILEUPLOAD_DATE > DATETIME('{DateTime.Today.AddDays(-7)}')"; //str_SQL = $@"SELECT * FROM T_CUSTOMERFEATURES WHERE customerfeatures_time > {DateTime.Today.ToString("yyyyMMddHHmmss")}"; //str_Serverpart = "459011112001,450093112101,450093132101"; //str_Serverpart = "340909223002,340909243002"; List list_TableName = new List() { "20" }; int int_Days = (int)(DateTime.Today - new DateTime(2021, 09, 01)).TotalDays; for (int i = 0; i < int_Days; i++) { string str_Result = ESSupport.Lib.HttpHelper.HttpPost("{\"ServerpartShopCodeS\":\"" + str_Serverpart + "\",\"TableName\":\"20\",\"OperateTime\":\"" + (new DateTime(2021, 09, 01)).AddDays(i).ToString("yyyy/MM/dd HH:mm:ss") + "\",\"SocketContent\":\"" + str_SQL + "\"}", "http://pos.eshangtech.com:8900/webApi_publish/WebSocket/sendSocketMsg", "application/json;charset=UTF-8"); TransResultBeginInvoke(DateTime.Now, "【" + (new DateTime(2021, 09, 01)).AddDays(i).ToString("yyyy/MM/dd") + "】"+str_Result); System.Threading.Thread.Sleep(60 * 1000); } return; //区服PB系统数据上传指令内容示例:"{\"ServerpartShopCodeS\":\"510500000000\",\"TableName\":\"20\",\"OperateTime\":\"2021/09/24 19:00:00\",\"SocketContent\":\"510500|013002|003|20210919183627|20210920172808\"}" List list = new List(); list.Add("510400|011002|1041|20210926214940|20210927212520"); str_Serverpart = "510400000000"; for (int i = 0; i < list.Count; i++) { string str_Result = ESSupport.Lib.HttpHelper.HttpPost("{\"ServerpartShopCodeS\":\"" + str_Serverpart + "\",\"TableName\":\"20\",\"OperateTime\":\"" + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + "\",\"SocketContent\":\"" + list[i] + "\"}", "http://pos.eshangtech.com:8900/webApi_publish/WebSocket/sendSocketMsg", "application/json;charset=UTF-8"); TransResultBeginInvoke(DateTime.Now, str_Result); System.Threading.Thread.Sleep(3000); } } catch (System.Net.WebException wex) { } catch (Exception ex) { } }) { IsBackground = true }.Start(); return; if (PosDataDownloadThread == null || !PosDataDownloadThread.IsAlive) { PosDataDownloadThread = new System.Threading.Thread(() => { //直连云端获取门店信息(获取门店ID、门店名称、业态编码、业态名称、门店状态、是否统一定价门店、是否上传营收数据、是否上传稽核数据、销售金额上限、销售数量上限、是否记录优惠折扣、所属业主单位ID、所属业主单位名称) bool b_DownLoad = DataDownload.DataDownload(ESSupport.Transfer.TransferDataDictionary.TableDataType.IssueShopInfoToMachine, DateTime.MinValue); //直连云端获取商品信息 DataDownload.DataDownload(ESSupport.Transfer.TransferDataDictionary.TableDataType.IssueCommodityInfoToMachine, DateTime.MinValue); //直连云端获取商品类别信息 DataDownload.DataDownload(ESSupport.Transfer.TransferDataDictionary.TableDataType.IssueCommodityTypeToMachine, DateTime.MinValue); //直连云端获取商品自定义类别信息 DataDownload.DataDownload(ESSupport.Transfer.TransferDataDictionary.TableDataType.IssueCommodityUserTypeToMachine, DateTime.MinValue); //直连云端获取收银员工号信息 DataDownload.DataDownload(ESSupport.Transfer.TransferDataDictionary.TableDataType.IssueSellWorkerInfoToMachine, DateTime.MinValue); //直连云端获取智能稽核任务信息 DataDownload.DataDownload(ESSupport.Transfer.TransferDataDictionary.TableDataType.IssueAuditTaskInfoToMachine, DateTime.MinValue); //直连云端获取促销活动信息 DataDownload.DataDownload(ESSupport.Transfer.TransferDataDictionary.TableDataType.IssuePromotionToMachine, DateTime.MinValue); //直连云端获取收银参数配置信息 DataDownload.DataDownload(ESSupport.Transfer.TransferDataDictionary.TableDataType.IssueConfigurationToMachine, DateTime.MinValue); DataUpload.DataUpload(ESSupport.Transfer.TransferDataDictionary.TableDataType.UploadMachineInfo, DateTime.Now); }) { IsBackground = true }; PosDataDownloadThread.Start(); } } #endregion #region 方法 -> 模拟上传压缩文件 /// /// 压缩文件上传 /// private void DataFileUp() { new System.Threading.Thread(() => { //上传数据前先立即上报心跳数据,解决定时心跳因关机导致本地数据版本未更新到服务器的问题 //ESSupport.Pos.ThreadHelper.StateFeedbackUpload($"http://{QualityHelper.dbip}:{QualityHelper.DataServicePort}/DataServices/Service.asmx"); //初始化压缩包上传实例 ESSupport.Transfer.ZipFileUpload zipFileUpload = new ESSupport.Transfer.ZipFileUpload(); zipFileUpload.NotifyEvent += ZipFileUpload_NotifyEvent; TransResultBeginInvoke(DateTime.Now, $"开始上传压缩文件"); //上传全部压缩包文件至服务器 zipFileUpload.UploadDataZipFile($"http://{"10.103.1.8"}:{"7081"}/PosDataUpload"); }) { IsBackground = true }.Start(); } #endregion #region 方法 ->模拟生成流水数据 /// /// 模拟生成流水数据 /// /// private void AddSellData(DateTime masterTime) { try { #region 首次执行,缓存商品数据 if (CommodityModelList == null) { CommodityModelList = new List(); DataTable _DataTable = ESSupport.Lib.SyBaseHelper.QueryOdbc( $@"SELECT ROW_NUMBER() OVER (ORDER BY D.COMMODITYMULTI_CODE DESC, CONVERT(INT,ISNULL(A.CONTAINER_CODE,'999999999')),A.COMMODITYEX_ID DESC) AS COLUMSLIST, A.COMMODITY_BARCODE,A.COMMODITY_CODE,A.COMMODITY_TYPE, A.COMMODITY_SYMBOL,A.COMMODITY_NAME,A.COMMODITY_RETAILPRICE, A.COMMODITY_UNIT,A.COMMODITY_RULE,A.COMMODITY_MEMBERPRICE, ISNULL(C.KITCHENCONFIG_INDEX,1000) AS KITCHENCONFIG_INDEX, ISNULL(A.METERINGMETHOD,1) AS METERINGMETHOD, ISNULL(D.COMMODITYMULTI_CODE,A.COMMODITY_CODE) AS COMMODITYMULTI_CODE, ISNULL(D.COMMODITYMULTI_NAME,A.COMMODITY_NAME) AS COMMODITYMULTI_NAME FROM T_COMMODITYEX A LEFT JOIN T_COMMODITYMULTI D ON A.COMMODITY_CODE = D.COMMODITY_CODE AND A.BUSINESSTYPE = D.BUSINESSTYPE AND A.SERVERPARTCODE = D.SERVERPARTCODE LEFT JOIN T_KITCHENCONFIG C ON A.COMMODITY_TYPE = C.COMMODITYTYPE WHERE A.SERVERPARTCODE = '{QualityHelper.serverpartcode}' AND A.SERVERPARTSHOP_ID = '{ESSupport.DataStorage.DataFunction.QueryShopID(QualityHelper.serverpartcode, QualityHelper.shopcode)}' AND A.ISVALID = 1 ORDER BY D.COMMODITYMULTI_CODE DESC, CONVERT(INT,ISNULL(A.CONTAINER_CODE,'999999999')), A.COMMODITYEX_ID DESC").Tables[0]; foreach (DataRow _DataRow in _DataTable.Rows) { CommodityModelList.Add(new Model.CommodityModel { CommodityBarCode = _DataRow["COMMODITY_BARCODE"].ToString(), CommodityCode = _DataRow["COMMODITY_CODE"].ToString(), CommodityName = _DataRow["COMMODITY_NAME"].ToString(), CommodityRule = _DataRow["COMMODITY_RULE"].ToString(), CommodityUnit = _DataRow["COMMODITY_UNIT"].ToString(), CommoditySymbol = _DataRow["COMMODITY_SYMBOL"].ToString(), CommodityType = _DataRow["COMMODITY_TYPE"].ToString(), PrintGoodsName = _DataRow["COMMODITY_NAME"].ToString(), KitchenIndex = decimal.Parse(_DataRow["KITCHENCONFIG_INDEX"].ToString()), MemberPrice = decimal.Parse(_DataRow["COMMODITY_MEMBERPRICE"].ToString()), MeteringMethod = decimal.Parse(_DataRow["METERINGMETHOD"].ToString()), MultiCode = _DataRow["COMMODITYMULTI_CODE"].ToString(), MultiName = _DataRow["COMMODITYMULTI_NAME"].ToString(), MultiPrice = decimal.Parse(_DataRow["COMMODITY_RETAILPRICE"].ToString()), RetailPrice = decimal.Parse(_DataRow["COMMODITY_RETAILPRICE"].ToString()) }); } } #endregion DataTable table_Goods = GoodsTableHelper.GetCommodityTableStructure(); int int_AddCount = new Random(Guid.NewGuid().GetHashCode()).Next(1, 100); for (int i = 0; i < int_AddCount; i++) { int int_GoodIndex = new Random(Guid.NewGuid().GetHashCode()).Next(0, CommodityModelList.Count); DataRow _goodsRow = GoodsAddHelper.IsVague(CommodityModelList[int_GoodIndex].CommodityBarCode, table_Goods, QualityHelper.WeighSign, out bool _bOverly); if (_goodsRow != null) { GoodsTableHelper.TouchInputSale(_goodsRow, table_Goods, _bOverly, decimal.Parse(_goodsRow["count"].ToString()), false); } } Model.PayAmountModel pay_PayAmountModel = new Model.PayAmountModel(); decimal sellcount = (decimal)table_Goods.Compute("SUM(COUNT)", ""); decimal _offprice = (decimal)table_Goods.Compute("SUM(DISCOUNT_RATE)", ""); decimal countprice = (decimal)table_Goods.Compute("SUM(PRICE)", ""); int int_InternalPay = new Random(Guid.NewGuid().GetHashCode()).Next(1, (int)countprice); GoodsTableHelper.CouponAdd(table_Goods, countprice - int_InternalPay); sellcount = (decimal)table_Goods.Compute("SUM(COUNT)", ""); _offprice = (decimal)table_Goods.Compute("SUM(DISCOUNT_RATE)", ""); countprice = (decimal)table_Goods.Compute("SUM(PRICE)", ""); pay_PayAmountModel.Wechat = new Random(Guid.NewGuid().GetHashCode()).Next(1, (int)countprice); pay_PayAmountModel.CashPay = countprice - pay_PayAmountModel.Wechat; pay_PayAmountModel.SellMasterCode = ESSupport.DataStorage.DataFunction.CreateUniqueCode(QualityHelper.serverpartcode, QualityHelper.shopcode, QualityHelper.machinecode); pay_PayAmountModel.CouponName = "企业会员优惠"; if (GetCashierData(table_Goods, GetTicketCode(), countprice, pay_PayAmountModel, countprice, masterTime, "", "", _offprice, sellcount, pay_PayAmountModel.SellMasterCode, "", "")) { ESSupport.Lib.SyBaseHelper.ExecuteSqlTran($@"INSERT INTO T_CUSTOMERINFO (CUSTOMERINFO_ID,SELLMASTER_CODE, ACQUISITION_TIME,SERVERPARTCODE,SHOPCODE,MACHINECODE,SELLMASTER_AMOUNT,CUSTOMER_AGE,CUSTOMER_GENDER) VALUES ({ESSupport.DataStorage.DataFunction.CreateNextSequence("T_CUSTOMERINFO", "CUSTOMERINFO_ID")}, '{pay_PayAmountModel.SellMasterCode}',DATETIME('{masterTime}'),'888888','042002','9999',{countprice},29,1)"); ESSupport.Lib.SyBaseHelper.ExecuteSqlTran($@"INSERT INTO T_MOBILE_PAY (MOBILE_PAY_ID, SERVERPARTCODE,SHOPCODE,MACHINECODE,WORKERCODE,MOBILEPAY_DATE, MOBILEPAY_TYPE,TICKET_CODE,TICKET_AMOUNT,MOBILEPAY_RESULT, MOBILEPAY_FEEDBACK,MOBILEPAY_STATE,MOBILEPAY_OPERATORS) VALUES ({ESSupport.DataStorage.DataFunction.CreateNextSequence("T_MOBILE_PAY", "MOBILE_PAY_ID")}, '888888','042002','9999','0001',DATETIME('{masterTime}'),'ALIPAY', '{$"8888880420029999{masterTime.ToString("yyyyMMddHHmmss")}"}', {pay_PayAmountModel.Wechat},5,'',1,1005)"); TransResultBeginInvoke(DateTime.Now, $"交易流水添加成功。共{sellcount}件商品,销售金额:{countprice}元;\r\n" + $"现金:{pay_PayAmountModel.CashPay}元;移动支付:{pay_PayAmountModel.Wechat}元;交易时间:{masterTime}"); //MessageBox.Show($"交易流水生成成功。共{sellcount}件商品,销售金额:{countprice}元"); } else { TransResultBeginInvoke(DateTime.Now, $"交易流水保存失败,原因:请查阅Log文件。共{sellcount}件商品,销售金额:{countprice}元;交易时间:{masterTime}"); //MessageBox.Show($"交易流水保存失败,原因:请查阅Log文件。共{sellcount}件商品,销售金额:{countprice}元"); } } catch (Exception ex) { TransResultBeginInvoke(DateTime.Now, $"交易流水保存失败。原因:{ex.Message}"); // MessageBox.Show($"交易流水保存失败。原因[{ex.TargetSite}]:{ex.Message}"); } } #endregion #region 方法 -> 模拟生成自然日数据 /// /// 自然日数据 /// /// private void CreateNaturalDay(DateTime endDate) { //实例化压缩文件处理传输类 ESSupport.ZipFile.PosDataZipFile zip_PosDataZipFile = new ESSupport.ZipFile.PosDataZipFile(QualityHelper.serverpartcode, QualityHelper.shopcode, QualityHelper.machinecode); zip_PosDataZipFile.NotifyEvent += Zip_PosDataZipFile_NotifyEvent; int int_Days = endDate.Subtract(endDate.Date.AddDays(-7)).Days; //补齐上一次自然日数据生成时间至当前时间的自然日结账数据 for (int i = int_Days; i > 0; i--) { if (ESSupport.Lib.SyBaseHelper.QueryOdbc( $@"SELECT 1 FROM T_ENDACCOUNT_NEW WHERE SERVERPARTCODE = '{QualityHelper.serverpartcode}' AND SHOPCODE = '{QualityHelper.shopcode}' AND MACHINECODE = '{QualityHelper.machinecode}' AND STARTDATE = DATETIME('{endDate.Date.AddDays(-1 * i).ToString("yyyy/MM/dd HH:mm:ss")}') AND ENDACCOUNT_TYPE = {(int)Common.PosDictionary.EndaccountType.NaturalDayAccount}").Tables[0].Rows.Count == 0) { //生成自然日结账数据 PosReportHelper.CreateEndaccount(QualityHelper.serverpartcode, QualityHelper.shopcode, QualityHelper.machinecode, QualityHelper.sellworkercode, QualityHelper.sellworkercode, QualityHelper.sellworkername, 0, endDate.Date.AddDays(-1 * i), endDate.Date.AddDays(-1 * (i - 1)).AddSeconds(-1), Common.PosDictionary.EndaccountType.NaturalDayAccount, false); //生成自然日流水压缩文件 zip_PosDataZipFile.CreateDataZipFile(endDate.Date.AddDays(-1 * i), endDate.Date.AddDays(-1 * (i - 1)).AddSeconds(-1), ESSupport.ZipFile.PosDataZipFile.DateType.NaturalDay); TransResultBeginInvoke(DateTime.Now, $"自然日流水文件生成成功。数据日期:{endDate.Date.AddDays(-1 * i)}"); } } } #endregion #region 方法 -> 模拟生成异常稽核数据 private void AddException(int exCount, DateTime operateDate) { List str_SQL = new List(); List list_AbnormalType = ESSupport.Lib.EnumHelper.EnumToList(); int int_max = ESSupport.DataStorage.DataFunction.CreateNextSequence("T_ABNORMALITY", "ABNORMALITY_ID"); int int_maxd = ESSupport.DataStorage.DataFunction.CreateNextSequence("T_ABNORMALITYDETAIL", "ABNORMALITYDETIL_ID"); int int_AbnormalType = new Random(Guid.NewGuid().GetHashCode()).Next(0, list_AbnormalType.Count); string str_UniqueCode = ESSupport.DataStorage.DataFunction.CreateUniqueCode("888888", "042002", "9999"); decimal dec_Amount = 0; for (int i = 0; i < exCount; i++) { int int_GoodIndex = new Random(Guid.NewGuid().GetHashCode()).Next(0, CommodityModelList.Count); str_SQL.Add($@"INSERT INTO T_ABNORMALITYDETAIL (ABNORMALITYDETIL_ID,ABNORMALITY_CODE, COMMODITY_CODE,COMMODITY_BARCODE,COMMODITY_TYPE,COMMODITY_NAME, COMMODITY_COUNT,COMMODITY_PRICE,TOTALDISCOUNT,TOTALAMOUNT,LINENUM,OPERATEDATE, ABNORMALITY_STATE,ABNORMALITYDETILS_DESC,TRANSFER_STATE,ABNORMALITYDETIL_CODE) VALUES({int_maxd + i},'{str_UniqueCode}','{CommodityModelList[int_GoodIndex].CommodityCode}', '{CommodityModelList[int_GoodIndex].CommodityBarCode}','{CommodityModelList[int_GoodIndex].CommodityType}', '{CommodityModelList[int_GoodIndex].CommodityName}',3,{CommodityModelList[int_GoodIndex].RetailPrice},0, {CommodityModelList[int_GoodIndex].RetailPrice * 3},1,DATETIME('{operateDate}'),1,NULL,1, '{ESSupport.DataStorage.DataFunction.CreateUniqueCode("888888", "042002", "9999")}')"); dec_Amount += (CommodityModelList[int_GoodIndex].RetailPrice * 3); } str_SQL.Add($@"INSERT INTO T_ABNORMALITY (ABNORMALITY_ID,ABNORMALITY_CODE,ABNORMALITY_PCODE, PROVINCE_ID,PROVINCE_CODE,PROVINCE_NAME,SERVERPART_ID,SERVERPART_CODE,SERVERPART_NAME,BUSINESSTYPE, BUSINESS_NAME,SERVERPARTSHOP_ID,SHOPCODE,SHOPNAME,MACHINECODE,MANAGER_CODE,SELLWORK_CODE, ABNORMALITY_TIME,ABNORMALITY_TYPE,SERIAL_CODE,COMMODITY_ROWCOUNT,COMMOTITY_COUNT,TOTALAMOUNT, ACTUALAMOUNT,ABNORMALITY_DESC,TRANSFER_STATE,ABNORMALITY_START) VALUES({int_max},'{str_UniqueCode}',NULL,NULL, '620000',NULL,NULL,'888888','驿商服务区','1000',NULL,7503,'042002','驿商门店商品测试','9999','','0001',DATETIME('{operateDate}'), {list_AbnormalType[int_AbnormalType].EnumValue},'',{exCount},{exCount * 3},{dec_Amount},{dec_Amount},'',0,DATETIME('{operateDate}'))"); if (str_SQL.Count > 0) { ESSupport.Lib.SyBaseHelper.ExecuteSqlTran(str_SQL); TransResultBeginInvoke(DateTime.Now, $"异常数据添加成功。数量:{str_SQL.Count}"); } } #endregion #region 方法 -> 登录账期班期数据验证 /// /// 登录账期班期数据验证 /// /// 收银员工号 /// public int PersonLogin(string userWorkerCode, out string sellWorkerCode) { sellWorkerCode = userWorkerCode; string _EndaccountCode; try { //不带收银员进行查询 DataTable _EndaccountTable = ESSupport.Lib.SyBaseHelper.QueryOdbc( $@"SELECT ENDACCOUNT_ID,ENDACCOUNT_CODE,STARTDATE FROM T_ENDACCOUNT_NEW WHERE ENDDATE IS NULL AND ENDACCOUNT_TYPE = 1 AND SERVERPARTCODE = '{QualityHelper.serverpartcode}' AND SHOPCODE='{QualityHelper.shopcode}' AND MACHINECODE = '{QualityHelper.machinecode}' ORDER BY ENDACCOUNT_ID DESC").Tables[0]; #region 已结账 if (_EndaccountTable.Rows.Count == 0) { DateTime _StartDate = dp_Start.DateTime; int _MaxID = ESSupport.DataStorage.DataFunction.CreateNextSequence("T_ENDACCOUNT_NEW", "ENDACCOUNT_ID"); _EndaccountCode = ESSupport.DataStorage.DataFunction.CreateUniqueCode(QualityHelper.serverpartcode, QualityHelper.shopcode, QualityHelper.machinecode); try { ESSupport.Lib.SyBaseHelper.ExecuteSqlTran( $@"INSERT INTO T_ENDACCOUNT_NEW (ENDACCOUNT_ID,SERVERPARTCODE,SHOPCODE, MACHINECODE,STARTDATE,ENDACCOUNT_CODE,ENDACCOUNT_TYPE,TRANSFER_STATE) VALUES ({_MaxID},'{QualityHelper.serverpartcode}','{QualityHelper.shopcode}', '{QualityHelper.machinecode}',DATETIME('{_StartDate}'),'{_EndaccountCode}',1,0)"); EndAccountStartDate = _StartDate; } catch (Exception ex) { ESSupport.Lib.LogHelper.WriteServiceLog($"账期插入失败[{ex.TargetSite}]:{ex.Message}"); return -1; } //插入交班记录 int _MaxPid = ESSupport.DataStorage.DataFunction.CreateNextSequence("T_PERSONSELL_NEW", "PERSONSELL_ID"); try { ESSupport.Lib.SyBaseHelper.ExecuteSqlTran( $@"INSERT INTO T_PERSONSELL_NEW (PERSONSELL_ID,SERVERPARTCODE,SHOPCODE, MACHINECODE,STARTDATE,SELLWORKER_CODE,ENDACCOUNT_CODE,WOKER_NUMBER,TRANSFER_STATE) VALUES({_MaxPid},'{QualityHelper.serverpartcode}','{QualityHelper.shopcode}','{QualityHelper.machinecode}', DATETIME('{_StartDate}'),'{userWorkerCode}','{_EndaccountCode}',1,0)"); } catch (Exception ex) { ESSupport.Lib.LogHelper.WriteServiceLog($"账期工班插入失败[{ex.TargetSite}]:{ex.Message}"); return -2; } } #endregion #region 未结账 else { _EndaccountCode = _EndaccountTable.Select("ENDACCOUNT_ID = MAX(ENDACCOUNT_ID)", "")[0]["ENDACCOUNT_CODE"].ToString(); DateTime.TryParse(_EndaccountTable.Select("ENDACCOUNT_ID = MAX(ENDACCOUNT_ID)", "")[0]["STARTDATE"].ToString(), out DateTime _STARTDATE); EndAccountStartDate = _STARTDATE; dp_Start.DateTime = _STARTDATE; if (dp_End.DateTime < dp_Start.DateTime) { dp_End.DateTime = dp_Start.DateTime; } if (_STARTDATE > dp_Start.DateTime) { return -5; } //检测是否已经交班 try { DateTime _PersonStartDate = dp_Start.DateTime; DataTable _PersonTable = ESSupport.Lib.SyBaseHelper.QueryOdbc( $@"SELECT PERSONSELL_ID,SELLWORKER_CODE FROM T_PERSONSELL_NEW WHERE ENDDATE IS NULL AND STARTDATE IS NOT NULL AND SERVERPARTCODE = '{QualityHelper.serverpartcode}' AND SHOPCODE='{QualityHelper.shopcode}' AND MACHINECODE = '{QualityHelper.machinecode}' AND ENDACCOUNT_CODE = '{_EndaccountCode}' ORDER BY PERSONSELL_ID DESC").Tables[0]; if (_PersonTable.Rows.Count == 0) { int _MaxID = ESSupport.DataStorage.DataFunction.CreateNextSequence("T_PERSONSELL_NEW", "PERSONSELL_ID"); int woker_number = ESSupport.DataStorage.DataFunction.CreateNextSequence("T_PERSONSELL_NEW", "WOKER_NUMBER", $"ENDACCOUNT_CODE='{_EndaccountCode}'"); try { ESSupport.Lib.SyBaseHelper.ExecuteSqlTran( $@"INSERT INTO T_PERSONSELL_NEW (PERSONSELL_ID,SERVERPARTCODE,SHOPCODE,MACHINECODE, STARTDATE,SELLWORKER_CODE,ENDACCOUNT_CODE,WOKER_NUMBER,TRANSFER_STATE) VALUES({_MaxID},'{QualityHelper.serverpartcode}','{QualityHelper.shopcode}','{QualityHelper.machinecode}', DATETIME('{_PersonStartDate}'),'{userWorkerCode}','{_EndaccountCode}',{woker_number},0)"); } catch (Exception ex) { ESSupport.Lib.LogHelper.WriteServiceLog($"账期工班插入失败[{ex.TargetSite}]:{ex.Message}"); return -2; } } else { string _SellWokerCode = _PersonTable.Select("PERSONSELL_ID = MAX(PERSONSELL_ID)", "")[0]["SELLWORKER_CODE"].ToString().ToUpper(); if (_SellWokerCode != userWorkerCode) { sellWorkerCode = _SellWokerCode; return -3; } } } catch (Exception ex) { return -4; } } #endregion } catch (Exception ex) { TransResultBeginInvoke(DateTime.Now, "账期查询失败:" + ex.Message); ESSupport.Lib.LogHelper.WriteServiceLog("账期查询失败:" + ex.Message); return -1; } if (!string.IsNullOrWhiteSpace(_EndaccountCode)) { EndAccountCode = _EndaccountCode; } return 0; } #endregion #region 方法 -> 插入支付流水 /// /// 插入流水 /// /// 商品列表 /// 流水号 /// 总金额 /// 支付集合 /// 找零金额 /// 付款时间 /// 会员卡号 /// 会员ID /// 优惠金额 /// 总数量 /// 销售流水编号 /// 移动支付订单号 /// 移动支付退款单号 /// 备注 /// public bool GetCashierData(DataTable commodityTable, string ticketCode, decimal masterAmount, Model.PayAmountModel payModel, decimal payAmount, DateTime masterTime, string MemberCard, string MemberId, decimal masterOffPrice, decimal sellCount, string sellMasterCode = "", string mobilePayCode = "", string merchantOrder = "", string sellDesc = "") { try { #region 新版流水插入 decimal COUPONPAY = 0; decimal MOBILEPAY = 0; string PAYMENT_TYPE = ""; string COUPON_TYPE = ""; string SELLMASTER_DESC = sellDesc; //优惠流水类型标识,用于判断本次交易是否需要记录优惠流水 PosReportHelper.DiscountSellMasterType dsmt_SellMasterType = PosReportHelper.DiscountSellMasterType.无; DataRow[] _Rows = commodityTable.Select("TICKETPREFIX IS NOT NULL"); if (_Rows.Length > 0 && payModel.AliPay == 0 && payModel.Wechat == 0 && payModel.UnionPay == 0) { ticketCode = "(" + _Rows[0]["TICKETPREFIX"] + ")" + ticketCode; } if (payModel.AliPay != 0) { MOBILEPAY += payModel.AliPay; ticketCode = (_Rows.Length > 0 ? ("(支-" + _Rows[0]["TICKETPREFIX"] + ")") : "(支)") + ticketCode; PAYMENT_TYPE = "ALIPAY"; } if (payModel.Wechat != 0) { MOBILEPAY += payModel.Wechat; ticketCode = (_Rows.Length > 0 ? ("(微-" + _Rows[0]["TICKETPREFIX"] + ")") : "(微)") + ticketCode; PAYMENT_TYPE = "WECHATPAY"; } if (payModel.UnionPay != 0) { MOBILEPAY += payModel.UnionPay; ticketCode = (_Rows.Length > 0 ? ("(银-" + _Rows[0]["TICKETPREFIX"] + ")") : "(银)") + ticketCode; PAYMENT_TYPE = "UNIONPAY"; } if (payModel.BusCoupon != 0) { COUPONPAY += payModel.BusCoupon; COUPON_TYPE = "BusCoupons"; } if (payModel.GroupPay != 0) { COUPONPAY += payModel.GroupPay; COUPON_TYPE = "GroupPay"; } //消费券 if (payModel.Coupon != 0) { COUPONPAY += payModel.Coupon; //COUPON_TYPE = "GroupPay"; if (!String.IsNullOrWhiteSpace(payModel.CouponNum)) { SELLMASTER_DESC = payModel.CouponNum; } COUPON_TYPE = "MealVoucher"; } //会员电子券 if (payModel.VipCoupon != 0) { COUPONPAY += payModel.VipCoupon; if (!String.IsNullOrWhiteSpace(payModel.CouponNum)) { SELLMASTER_DESC = payModel.CouponNum; } COUPON_TYPE = "VipCoupon"; } //在线订单支付 if (payModel.OnlinePay != 0) { COUPON_TYPE = "OnlinePay"; } if (sellCount == 0) { sellCount = (decimal)commodityTable.Compute("SUM(COUNT)", ""); } int _MaxCode = ESSupport.DataStorage.DataFunction.CreateNextSequence("T_SELLMASTER", "SELLMASTER_ID"); int _MaxConsumId = ESSupport.DataStorage.DataFunction.CreateNextSequence("T_CONSUMPTIONRECORD", "CONSUMPTIONRECORD_ID"); if (string.IsNullOrWhiteSpace(sellMasterCode)) { sellMasterCode = ESSupport.DataStorage.DataFunction.CreateUniqueCode(QualityHelper.serverpartcode, QualityHelper.shopcode, QualityHelper.machinecode); payModel.SellMasterCode = sellMasterCode; } List _InsertList = new List(); string _InsertSql = @"INSERT INTO T_SELLMASTER (SELLMASTER_ID,SELLMASTER_CODE,SERVERPARTCODE, SERVERPART_NAME,SHOPCODE,SHOPNAME,MACHINECODE,SELLWORKER_CODE, SELLWORKER_NAME,SELLMASTER_DATE,TICKET_CODE,SELLMASTER_COUNT,SELLMASTER_OFFPRICE, SELLMASTER_AMOUNT,CASHPAY,BANKPAY,MEMBERPAY,COUPONPAY,MOBILEPAY,INTERNALPAY, OTHERPAY,PAYMENT_TYPE,MOBILEPAY_CODE,MERCHANT_ORDER,SELLMASTER_DESC,TRANSFER_STATE, COUPON_TYPE,PAY_AMOUNT) VALUES(" + _MaxCode + ",'" + sellMasterCode + "','" + QualityHelper.serverpartcode + "','" + QualityHelper.serverpartname + "','" + QualityHelper.shopcode + "','" + QualityHelper.shopname + "','" + QualityHelper.machinecode + "','" + QualityHelper.sellworkercode + "','" + QualityHelper.sellworkername + "',DATETIME('" + masterTime + "'),'" + ticketCode + "'," + sellCount + "," + masterOffPrice + "," + masterAmount + "," + payModel.CashPay + "," + payModel.BankPay + "," + payModel.MemberPay + "," + COUPONPAY + "," + MOBILEPAY + "," + payModel.InternalPay + "," + payModel.OtherPay + ",'" + PAYMENT_TYPE + "','" + mobilePayCode + "','" + merchantOrder + "','" + SELLMASTER_DESC + "',0,'" + COUPON_TYPE + "'," + payAmount + ")"; //备份数据流水主表 string _strDataSellMaster = _MaxCode + "|" + sellMasterCode + "|" + QualityHelper.serverpartcode + "|" + QualityHelper.serverpartname + "|" + QualityHelper.shopcode + "|" + QualityHelper.shopname + "|" + QualityHelper.machinecode + "|" + QualityHelper.sellworkercode + "|" + QualityHelper.sellworkername + "|" + masterTime.ToString("yyyy/MM/dd HH:mm:ss") + "|" + ticketCode + "|" + sellCount.ToString("F3") + "|" + masterOffPrice.ToString("F3") + "|" + masterAmount.ToString("F3") + "|" + payModel.CashPay.ToString("F3") + "|" + payModel.BankPay.ToString("F3") + "|" + payModel.MemberPay.ToString("F3") + "|" + COUPONPAY.ToString("F3") + "|" + MOBILEPAY.ToString("F3") + "|" + payModel.InternalPay.ToString("F3") + "|" + payModel.OtherPay.ToString("F3") + "|" + PAYMENT_TYPE + "|" + mobilePayCode + "|" + merchantOrder + "|" + SELLMASTER_DESC + "|" + 0 + "|" + COUPON_TYPE + "|" + payAmount.ToString("F3"); int _MaxID = ESSupport.DataStorage.DataFunction.CreateNextSequence("T_SELLDETAILS", "SELLDETAILS_ID"); string _InsertSql2 = @"INSERT INTO T_SELLDETAILS (SELLDETAILS_ID,SELLMASTER_CODE,COMMODITY_CODE, COMMODITY_BARCODE,COMMODITY_NAME,SELLDETAILS_COUNT,SELLDETAILS_PRICE, SELLDETAILS_OFFPRICE,SELLDETAILS_AMOUNT,LINENUM,PAYMENT_TYPE,SELLDETAILS_DESC, TRANSFER_STATE,CREATE_DATE,COMMODITY_TYPE,COMMODITY_SYMBOL) VALUES"; bool bCount = false; bool bAmount = false; List _DataSellDetailsList = new List(); //会员价交易记录 List _VIPSellDetailList = new List(); //获取会员交易流水ID int _VIPSellMaxID = ESSupport.DataStorage.DataFunction.CreateNextSequence("T_SELLDATA_VIP", "SELLDATA_ID"); for (int i = 0; i < commodityTable.Rows.Count; i++) { _InsertSql2 += "(" + (_MaxID + i) + ",'" + sellMasterCode + "','" + commodityTable.Rows[i]["commodity_code"].ToString() + "','" + commodityTable.Rows[i]["commodity_barcode"].ToString() + "','" + commodityTable.Rows[i]["commodity_name"].ToString() + "'," + commodityTable.Rows[i]["count"] + "," + commodityTable.Rows[i]["commodity_retailprice"] + "," + commodityTable.Rows[i]["discount_rate"] + "," + commodityTable.Rows[i]["price"] + "," + (i + 1) + ",'" + PAYMENT_TYPE + "',NULL,0,DATETIME('" + masterTime + "'),'" + commodityTable.Rows[i]["commodity_type"] + "','" + commodityTable.Rows[i]["commodity_symbol"] + "'),"; //备份数据流水详情列表 _DataSellDetailsList.Add((_MaxID + i).ToString() + "|" + sellMasterCode + "|" + commodityTable.Rows[i]["commodity_code"].ToString() + "|" + commodityTable.Rows[i]["commodity_barcode"].ToString() + "|" + commodityTable.Rows[i]["commodity_name"].ToString() + "|" + commodityTable.Rows[i]["count"].ToString() + "|" + commodityTable.Rows[i]["commodity_retailprice"].ToString() + "|" + commodityTable.Rows[i]["discount_rate"].ToString() + "|" + commodityTable.Rows[i]["price"].ToString() + "|" + (i + 1).ToString() + "|" + PAYMENT_TYPE + "|" + masterTime.ToString("yyyy/MM/dd HH:mm:ss") + "||" + 0 + "|" + commodityTable.Rows[i]["commodity_type"].ToString() + "|" + commodityTable.Rows[i]["commodity_symbol"].ToString()); try { if ((decimal)commodityTable.Rows[i]["count"] > decimal.Parse(QualityHelper.sellcount) && commodityTable.Rows[i]["commodity_code"].ToString() != "00000000" && commodityTable.Rows[i]["commodity_code"].ToString() != "99999996" && commodityTable.Rows[i]["commodity_code"].ToString() != "99999997" && commodityTable.Rows[i]["commodity_code"].ToString() != "99999998" && commodityTable.Rows[i]["commodity_code"].ToString() != "99999999") { bCount = true; } } catch { } try { if ((decimal)commodityTable.Rows[i]["price"] > decimal.Parse(QualityHelper.factamount) && commodityTable.Rows[i]["commodity_code"].ToString() != "00000000" && commodityTable.Rows[i]["commodity_code"].ToString() != "99999996" && commodityTable.Rows[i]["commodity_code"].ToString() != "99999997" && commodityTable.Rows[i]["commodity_code"].ToString() != "99999998" && commodityTable.Rows[i]["commodity_code"].ToString() != "99999999") { bAmount = true; } } catch { } #region 刷卡促销插入单独流水 if (payModel.MemberPay > 0 || !string.IsNullOrWhiteSpace(MemberId) || commodityTable.Rows[i]["promotionid"].ToString() != "") { string _strInsertSql = string.Format( @"INSERT INTO T_CONSUMPTIONRECORD (CONSUMPTIONRECORD_ID, PROMOTION_ID,MEMBERSHIP_ID,MEMBERSHIP_CARD, CONSUMPTIONRECORD_DATE,SERVERPART_CODE,SERVERPART_NAME, SERVERPARTSHOP_ID,SHOPCODE,SHOPNAME,MACHINECODE, TICKET_CODE,COMMODITY_CODE,COMMODITY_BARCODE,COMMODITY_NAME, CONSUME_COUNT,AVERAGE_PRICE,CONSUME_PRICE,LINE_NUMBER) VALUES ({0},{1},{2},{3},DATETIME('{4}'),'{5}','{6}',{7},'{8}','{9}','{10}','{11}','{12}','{13}','{14}',{15},{16},{17},{18})", _MaxConsumId, commodityTable.Rows[i]["promotionid"].ToString() == "" ? "0" : commodityTable.Rows[i]["promotionid"], string.IsNullOrWhiteSpace(MemberId) ? "NULL" : MemberId, string.IsNullOrWhiteSpace(MemberCard) ? "NULL" : ("'" + MemberCard + "'"), masterTime, QualityHelper.serverpartcode, QualityHelper.serverpartname, QualityHelper.serverpartshop_id, QualityHelper.shopcode, QualityHelper.shopname, QualityHelper.machinecode, ticketCode, commodityTable.Rows[i]["commodity_code"], commodityTable.Rows[i]["commodity_barcode"], commodityTable.Rows[i]["commodity_name"], commodityTable.Rows[i]["count"], commodityTable.Rows[i]["commodity_retailprice"], commodityTable.Rows[i]["price"], i + 1); _InsertList.Add(_strInsertSql); _MaxConsumId += 1; } #endregion #region 会员价消费记录独立流水 if (!string.IsNullOrWhiteSpace(Common.PosControl.MemberCode)) { _VIPSellDetailList.Add($@"INSERT INTO T_SELLDATA_VIP (SELLDATA_ID,SELLDATA_DATE,SERVERPARTCODE,SHOPCODE, MACHINECODE,TICKETCODE,WORKERCODE,COMMODITY_CODE, SELLCOUNT,SELLPRICE,OFFPRICE,FACTAMOUNT,LINENUM,FLAG) VALUES ({_VIPSellMaxID},DATETIME('{masterTime.ToString("yyyy/MM/dd HH:mm:ss")}'), '{QualityHelper.serverpartcode}','{QualityHelper.shopcode}', '{QualityHelper.machinecode}','{ticketCode}','{QualityHelper.sellworkercode}', '{commodityTable.Rows[i]["commodity_code"]}',{commodityTable.Rows[i]["count"]}, {commodityTable.Rows[i]["commodity_retailprice"]},{commodityTable.Rows[i]["discount_rate"]}, {commodityTable.Rows[i]["price"]},{i + 1},7 )"); _VIPSellMaxID += 1; } //优惠券消费记录独立流水 if (!string.IsNullOrWhiteSpace(payModel.CouponName)) { if (!string.IsNullOrWhiteSpace(payModel.CouponNum)) { _VIPSellDetailList.Add($@"INSERT INTO T_SELLDATA_VIP (SELLDATA_ID,SELLDATA_DATE,SERVERPARTCODE,SHOPCODE, MACHINECODE,TICKETCODE,WORKERCODE,COMMODITY_CODE, SELLCOUNT,SELLPRICE,OFFPRICE,FACTAMOUNT,LINENUM,FLAG) VALUES ({_VIPSellMaxID},DATETIME('{masterTime.ToString("yyyy/MM/dd HH:mm:ss")}'), '{QualityHelper.serverpartcode}','{QualityHelper.shopcode}', '{QualityHelper.machinecode}','{ticketCode}','{QualityHelper.sellworkercode}', '{commodityTable.Rows[i]["commodity_code"]}',{commodityTable.Rows[i]["count"]}, {commodityTable.Rows[i]["commodity_retailprice"]},{commodityTable.Rows[i]["discount_rate"]}, {commodityTable.Rows[i]["price"]},{i + 1},5 )"); _VIPSellMaxID += 1; } else { string str_Flag; switch (payModel.CouponName) { case "企业会员优惠": str_Flag = "4"; break; case "大巴券优惠": str_Flag = "2"; break; case "团购餐优惠": str_Flag = "2"; break; default://其他优惠,如:电子券(无固定名称) str_Flag = "5"; break; } _VIPSellDetailList.Add($@"INSERT INTO T_SELLDATA_VIP (SELLDATA_ID,SELLDATA_DATE,SERVERPARTCODE,SHOPCODE, MACHINECODE,TICKETCODE,WORKERCODE,COMMODITY_CODE, SELLCOUNT,SELLPRICE,OFFPRICE,FACTAMOUNT,LINENUM,FLAG) VALUES ({_VIPSellMaxID},DATETIME('{masterTime.ToString("yyyy/MM/dd HH:mm:ss")}'), '{QualityHelper.serverpartcode}','{QualityHelper.shopcode}', '{QualityHelper.machinecode}','{ticketCode}','{QualityHelper.sellworkercode}', '{commodityTable.Rows[i]["commodity_code"]}',{commodityTable.Rows[i]["count"]}, {commodityTable.Rows[i]["commodity_retailprice"]},{commodityTable.Rows[i]["discount_rate"]}, {commodityTable.Rows[i]["price"]},{i + 1},{str_Flag} )"); _VIPSellMaxID += 1; } } #endregion } if (!string.IsNullOrWhiteSpace(Common.PosControl.MemberCode)) { dsmt_SellMasterType = PosReportHelper.DiscountSellMasterType.会员价消费; } //保存促销交易记录到优惠流水表 if (commodityTable.Select("promotionid is not null").Length > 0) { dsmt_SellMasterType = PosReportHelper.DiscountSellMasterType.促销活动; } //优惠券交易记录独立流水 if (!string.IsNullOrWhiteSpace(payModel.CouponName)) { if (!string.IsNullOrWhiteSpace(payModel.CouponNum)) { dsmt_SellMasterType = PosReportHelper.DiscountSellMasterType.电子优惠券; } else { switch (payModel.CouponName) { case "企业会员优惠": dsmt_SellMasterType = PosReportHelper.DiscountSellMasterType.企业会员; break; case "大巴券优惠": case "团购餐优惠": dsmt_SellMasterType = PosReportHelper.DiscountSellMasterType.大巴券; break; default://其他优惠,如:电子券(无固定名称) dsmt_SellMasterType = PosReportHelper.DiscountSellMasterType.电子优惠券; break; } } } //保存会员价交易记录到数据库 try { if (_VIPSellDetailList.Count > 0) { ESSupport.Lib.SyBaseHelper.ExecuteSqlTran(_VIPSellDetailList); } } catch { } if (_InsertSql2.Length > 2) { _InsertSql2 = _InsertSql2.Substring(0, _InsertSql2.Length - 1); } _InsertList.Add(_InsertSql); _InsertList.Add(_InsertSql2); ESSupport.Lib.SyBaseHelper.ExecuteSqlTran(_InsertList); #endregion if (dsmt_SellMasterType != PosReportHelper.DiscountSellMasterType.无) { //保存优惠流水 PosReportHelper.SaveDiscountSelldata(QualityHelper.serverpartcode, QualityHelper.serverpartname, QualityHelper.shopcode, QualityHelper.machinecode, QualityHelper.sellworkercode, QualityHelper.sellworkername, ticketCode, masterTime, commodityTable, payModel, dsmt_SellMasterType); } //List abnormalModels = new List(); if (bCount && bAmount) { AbnormalRecord.GetSell(AbnormalRecord.GetAbnormalList( (int)Common.PosDictionary.AbnormalType.数量及金额超限, commodityTable, masterTime), ticketCode, masterTime); } else { if (bCount) { AbnormalRecord.GetSellCount(AbnormalRecord.GetAbnormalList( (int)Common.PosDictionary.AbnormalType.单品数量超限, commodityTable, masterTime), ticketCode, masterTime); } if (bAmount) { AbnormalRecord.GetSellPrice(AbnormalRecord.GetAbnormalList( (int)Common.PosDictionary.AbnormalType.单笔金额超限, commodityTable, masterTime), ticketCode, masterTime); } } return true; } catch (Exception ex) { ESSupport.Lib.LogHelper.WriteServiceLog($"交易流水保存失败。原因:{ex.Message}"); return false; } } #endregion #region 方法 -> 获取流水号 /// /// 获取流水号 /// /// public string GetTicketCode() { try { string _strSelectSql = String.Format("SELECT ISNULL(MAX(RIGHT(TICKET_CODE,5)),'00000') FROM T_SELLMASTER " + "WHERE SELLMASTER_DATE>DATETIME('{0}') AND MACHINECODE='{1}' AND UPPER(SELLWORKER_CODE)=UPPER('{2}')", DateTime.Today, QualityHelper.machinecode, QualityHelper.sellworkercode); DataTable _DataTable = ESSupport.Lib.SyBaseHelper.QueryOdbc(_strSelectSql).Tables[0]; if (_DataTable.Rows.Count > 0) { if (int.TryParse(_DataTable.Rows[0][0].ToString(), out int TicketCode)) { return (TicketCode + 1).ToString().PadLeft(5, '0'); } } } catch { } return "00001"; } #endregion #region 委托事件 -> 通知服务消息回调事件 /// /// 上传消息回调 /// /// /// private void DataUpload_NotifyEvent(object sender, ESSupport.Model.Common.NotifyEventArgs e) { TransResultBeginInvoke(e.NotifyLoggerTime, e.NotifyLoggerMessage); } /// /// 下载消息回调 /// /// /// private void DataDownload_NotifyEvent(object sender, ESSupport.Model.Common.NotifyEventArgs e) { TransResultBeginInvoke(e.NotifyLoggerTime, e.NotifyLoggerMessage); } /// /// 消息通知服务信息回调 /// /// /// private void PosSocket_NotifyEvent(object sender, ESSupport.Model.Common.NotifyEventArgs e) { TransResultBeginInvoke(e.NotifyLoggerTime, e.NotifyLoggerMessage); } private void ZipFileUpload_NotifyEvent(object sender, ESSupport.Model.Common.NotifyEventArgs e) { TransResultBeginInvoke(e.NotifyLoggerTime, e.NotifyLoggerMessage); } private void Zip_PosDataZipFile_NotifyEvent(object sender, ESSupport.Model.Common.NotifyEventArgs e) { TransResultBeginInvoke(e.NotifyLoggerTime, e.NotifyLoggerMessage); } #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 = new System.Collections.ObjectModel.ObservableCollection(); } ResultMessage ResultMessage = new ResultMessage() { TransDate = triggerTime, TransResult = resultMessage }; TransResultTable.Insert(0, ResultMessage); //界面只保留最近5分钟的日志信息 foreach (ResultMessage _RowTemp in TransResultTable.ToList().FindAll(p => p.TransDate < DateTime.Now.AddMinutes(-5))) { TransResultTable.Remove(_RowTemp); } DataTransResult.AutoGenerateColumns = false; DataTransResult.SelectionMode = DataGridSelectionMode.Single; DataTransResult.ItemsSource = TransResultTable; } /// /// 运行日志记录表结构 /// /// 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 } }