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, "http://pos.eshangtech.com:8900/webApi_publish"); 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 模拟上传压缩文件 [System.Runtime.InteropServices.DllImport("user32.dll")] static extern void keybd_event ( byte bVk,// 虚拟键值 byte bScan,// 硬件扫描码 uint dwFlags,// 动作标识 IntPtr dwExtraInfo// 与键盘动作关联的辅加信息 ); private void DataFileUpload_Click(object sender, RoutedEventArgs e) { //new System.Threading.Thread(() => //{ System.Windows.Forms.SendKeys.SendWait("{PRTSC}"); System.Drawing.Bitmap bmp = (System.Drawing.Bitmap)System.Windows.Forms.Clipboard.GetDataObject().GetData(System.Windows.Forms.DataFormats.Bitmap); if (bmp != null) { string str_Directory = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "CustomerInfo", DateTime.Today.ToString("yyyy_MM_dd")); if (!System.IO.Directory.Exists(str_Directory)) { System.IO.Directory.CreateDirectory(str_Directory); } bmp.Save(System.IO.Path.Combine(str_Directory, $"Screen.png")); } //keybd_event((byte)0x2c, 0, 0x0, IntPtr.Zero);//down // System.Windows.Forms.Application.DoEvents(); //添加引用system.windows.forms // keybd_event((byte)0x2c, 0, 0x2, IntPtr.Zero);//up // System.Windows.Forms.Application.DoEvents(); // System.Drawing.Bitmap bmp = null; // System.Windows.Forms.Application.DoEvents(); // System.Windows.Forms.IDataObject newobject = System.Windows.Forms.Clipboard.GetDataObject(); // if (System.Windows.Forms.Clipboard.ContainsImage()) // { // bmp = (System.Drawing.Bitmap)(System.Windows.Forms.Clipboard.GetImage().Clone()); // } // if (bmp != null) // { // System.IO.Directory.CreateDirectory(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, // "CustomerInfo", DateTime.Today.ToString("yyyy_MM_dd"))); // bmp.Save(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, // "CustomerInfo", DateTime.Today.ToString("yyyy_MM_dd"), $"Screen.png")); // } //}) //{ IsBackground = true }.Start(); //foreach (KeyValuePair item in PosSocketList) //{ // if (!item.Value.ClientRuning) // { // item.Value.Start(); // System.Threading.Thread.Sleep(1000); // } // item.Value.SendSocketMsg(ESSupport.Transfer.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 = '451304143004442720211124195212242041'"; //str_SQL = $@"UPDATE T_DATAFILEUPLOAD SET DATAFILEUPLOAD_STATE = 0 // WHERE DATAFILEUPLOAD_NAME = '620036032001351220211106155857_EndAccount.zip'"; //str_SQL = $@"INSERT INTO T_DATAFILEUPLOAD (DATAFILEUPLOAD_GUID, // DATAFILEUPLOAD_NAME,DATAFILEUPLOAD_DATE,DATAFILEUPLOAD_STATE) // VALUES ('{Guid.NewGuid().ToString("N")}','620036032001351220211106155857_EndAccount.zip', // DATETIME('{DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")}'),0)"; //str_SQL = $@"SELECT COUNT(*) AS TICKETCOUNT, // ISNULL(SUM(SELLMASTER_COUNT),0) AS SELLMASTER_COUNT, // ISNULL(SUM(SELLMASTER_OFFPRICE),0) AS SELLMASTER_OFFPRICE, // ISNULL(SUM(SELLMASTER_AMOUNT),0) AS SELLMASTER_AMOUNT, // ISNULL(SUM(CASHPAY),0) AS CASHPAY, // ISNULL(SUM(BANKPAY),0) AS BANKPAY, // ISNULL(SUM(MEMBERPAY),0) AS MEMBERPAY, // ISNULL(SUM(COUPONPAY),0) AS COUPONPAY, // ISNULL(SUM(MOBILEPAY),0) AS MOBILEPAY, // ISNULL(SUM(INTERNALPAY),0) AS INTERNALPAY, // ISNULL(SUM(OTHERPAY),0) AS OTHERPAY //FROM T_SELLMASTER //WHERE SERVERPARTCODE='620523' AND // SHOPCODE='012001' AND MACHINECODE='3524' AND // SELLMASTER_DATE BETWEEN DATETIME('2021/10/21 00:00:00') AND // DATETIME('2021/10/21 23:59:59')"; string str_Serverpart = "620018012101,620018032101"; //str_SQL = "SELECT * FROM T_MOBILE_PAY WHERE MOBILEPAY_DATE BETWEEN DATETIME('2021/12/07 10:00:00') AND DATETIME('2021/12/07 10:30:00') ORDER BY MOBILEPAY_DATE"; //str_SQL = "Select AbnormalAudit_Guid From T_AbnormalAudit"; //str_SQL = "Select * From T_YsMobilePay Where MobilePay_Date >= 20220117000000"; str_SQL = "Delete From T_Promotion_New "; //str_SQL = @"SELECT A.ABNORMALITY_TYPE,COUNT(1) FROM T_ABNORMALITY A //WHERE A.ABNORMALITY_TIME BETWEEN DATETIME('2021/12/05') AND DATETIME('2021/12/07') //GROUP BY A.ABNORMALITY_TYPE"; ESSupport.Lib.HttpHelper.HttpPost("{\"ServerpartShopCodeS\":\"" + str_Serverpart + "\",\"TableName\":\"" + "11" + "\",\"OperateTime\":\"" + DateTime.MinValue.ToString("yyyy/MM/dd HH:mm:ss") + "\",\"SocketContent\":\"" + str_SQL + "\"}", "http://pos.eshangtech.com:7198/webApi_publish/WebSocket/sendSocketMsg", "application/json;charset=UTF-8"); return; //TransResultBeginInvoke(DateTime.Now, str_Result); str_SQL = "UPDATE T_ENDACCOUNT_NEW SET TRANSFER_STATE = 0 WHERE ENDACCOUNT_CODE = '62001811300445392021112517565096742'"; //str_SQL = @"INSERT INTO T_ENDACCOUNT_NEW ( ENDACCOUNT_ID, // ENDACCOUNT_CODE,STARTDATE,ENDDATE,SERVERPARTCODE, // SHOPCODE,MACHINECODE,ENDPERSON_CODE,TICKET_COUNT, // TOTAL_COUNT,TOTAL_AMOUNT,TOTAL_OFFAMOUNT, // CASHPAY,BANKPAY,COUPONPAY,MEMBERPAY,MOBILEPAY, // INTERNALPAY,CONTRIBUTION_AMOUNT,ENDACCOUNT_TYPE, // PAYMENT_DETAILS,TRANSFER_STATE) //VALUES(0, '620523012001352420211021142325665910', // DATETIME('2021/10/21 00:00:00'), // DATETIME('2021/10/21 23:59:59'), // '620523', '012001', '3524', '9001', // 35, 81, 541.5, 0, 229.5, 0, 0, 0, 312, // 0, 229.5, 2, 'ALIPAY:42.00,WECHATPAY:270.00', 0)"; //str_Serverpart = "515320131201,515320012201,515320032201,515320111201,515320013002,515320033002";6205230120013524 List list_TableName = new List() { "20" }; str_Serverpart = "510100031002,510100032201,510100033002,510200011002,510200012201,510200013002,510200031002,510200032201,510200033002,510300011002,510300012201,510300013002,510300031002,510300032201,510300033002,510400011002,510400012201,510400013002,510400031002,510400032201,510400033002,510500011002,510500013002,510500031002,510500033002,510600011002,510600012201,510600031002,510600032201,510600033002,510600133006,510700011002,510700012201,510700013002,510800011002,510800013002,510800031002,510800032201,510800033002,510900012201,510900013002,510900013101,510900032201,510900033002,510900033101,511000011002,511000012201,511000013002,511000014010,511000032201,511000033002,511000034010,511100011002,511100012201,511100013002,511100032201,511100033002,511100113902,511100133902,511200011301,511200012201,511200013002,511200013101,511200031301,511200032201,511200033002,511200033101,511300011002,511300012201,511300013002,511300031002,511300032201,511300033002,511400011002,511400012201,511400013002,511500011002,511500012201,511500013002,511500031002,511500032201,511500033002,511500034002,511800011002,511800012201,511800013002,511800031002,511800032201,511800033002,511900011002,511900012201,511900013002,511900031002,511900032201,511900033002,511900033005,513100011002,513100013002,513100031002,513100032201,513100033002"; //int int_Days = 60; str_SQL = ""; DateTime date_End = DateTime.Today.AddDays(-1); for (int i = 0; i < 60; i++) { if (date_End.AddDays(-1 * i) < DateTime.Today) { string str_Result = ESSupport.Lib.HttpHelper.HttpPost("{\"ServerpartShopCodeS\":\"" + str_Serverpart + "\",\"TableName\":\"" + "20" + "\",\"OperateTime\":\"" + date_End.AddDays(-1 * i).ToString("yyyy/MM/dd HH:mm:ss") + "\",\"SocketContent\":\"" + str_SQL + "\"}", "http://pos.eshangtech.com:7198/webApi_publish/WebSocket/sendSocketMsg", "application/json;charset=UTF-8"); TransResultBeginInvoke(DateTime.Now, str_Result); System.Threading.Thread.Sleep(5 * 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"); 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 (Exception ex) { } }) { IsBackground = true }.Start(); //bool b= DataDownload.DataDownload(ESSupport.Transfer.TableDataType.IssueOnlineBillToMachine, DateTime.Now, "20200714-3300003748-001"); return; if (PosDataDownloadThread == null || !PosDataDownloadThread.IsAlive) { PosDataDownloadThread = new System.Threading.Thread(() => { //直连云端获取门店信息(获取门店ID、门店名称、业态编码、业态名称、门店状态、是否统一定价门店、是否上传营收数据、是否上传稽核数据、销售金额上限、销售数量上限、是否记录优惠折扣、所属业主单位ID、所属业主单位名称) bool b_DownLoad = DataDownload.DataDownload(ESSupport.Transfer.TableDataType.IssueShopInfoToMachine, DateTime.MinValue); //直连云端获取商品信息 DataDownload.DataDownload(ESSupport.Transfer.TableDataType.IssueCommodityInfoToMachine, DateTime.MinValue); //直连云端获取商品类别信息 DataDownload.DataDownload(ESSupport.Transfer.TableDataType.IssueCommodityTypeToMachine, DateTime.MinValue); //直连云端获取商品自定义类别信息 DataDownload.DataDownload(ESSupport.Transfer.TableDataType.IssueCommodityUserTypeToMachine, DateTime.MinValue); //直连云端获取收银员工号信息 DataDownload.DataDownload(ESSupport.Transfer.TableDataType.IssueSellWorkerInfoToMachine, DateTime.MinValue); //直连云端获取智能稽核任务信息 DataDownload.DataDownload(ESSupport.Transfer.TableDataType.IssueAuditTaskInfoToMachine, DateTime.MinValue); //直连云端获取促销活动信息 DataDownload.DataDownload(ESSupport.Transfer.TableDataType.IssuePromotionToMachine, DateTime.MinValue); //直连云端获取收银参数配置信息 DataDownload.DataDownload(ESSupport.Transfer.TableDataType.IssueConfigurationToMachine, DateTime.MinValue); DataUpload.DataUpload(ESSupport.Transfer.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 } }