using DevComponents.DotNetBar; using POSV.Component; using POSV.Entity; using POSV.HandOver; using POSV.Helper; using POSV.MessageEvent; using POSV.MsgCenter; using POSV.ShoppingCart; using POSV.StoreBusiness; using POSV.Utils; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Reflection; using System.Text; using System.Threading; using System.Windows.Forms; namespace POSV.Shift { public partial class ShiftForm : BusinessForm { HandOverTicket handOverTicket = null; bool splitPayFinished = false; public ShiftForm() { InitializeComponent(); this.controlBox1.Text = "收银交班"; this.controlBox1.ShowApplicationVersion = false; LOGGER.Info("打开交班界面"); } protected override void OnLoad(EventArgs e) { base.OnLoad(e); #region subin 20231025 分账由实时改为交班时分账 MsgEvent.RemoveListener(Constant.SPLITPAY_UPLOAD_PROGRESS, MessageEventNotify); MsgEvent.Receive(Constant.SPLITPAY_UPLOAD_PROGRESS, MessageEventNotify); MsgEvent.RemoveListener(Constant.SPLITPAY_UPLOAD_FINISHED, SplitPayFinishEventNotify); MsgEvent.Receive(Constant.SPLITPAY_UPLOAD_FINISHED, SplitPayFinishEventNotify); #endregion if (this.DesignMode) return; DefaultGridStyle.setDefaultGridStyle(this.payListTable); this.payListTable.PrimaryGrid.Columns["paySource"].CellMergeMode = DevComponents.DotNetBar.SuperGrid.CellMergeMode.Vertical; //正在交班中 Global.isHandOver = true; handOverTicket = loadData(); //汇总支付方式 List detail = getHandOverDetail(); foreach (HandOverDetail handOverDetail in detail) { handOverDetail.HandsMoney = handOverDetail.SumMoney; } handOverTicket.Detail = detail; //汇总菜品类别销售 List ProductList = loadHandOverProduct(); handOverTicket.Product = ProductList; //汇总班次优惠金额 List InfoList = loadHandOverInfo(); handOverTicket.Info = InfoList; //汇总班次支付方式明细 List payList = loadHandOverPay(); handOverTicket.Pay = payList; //汇总班次菜品分类 List productTypeList = loadHandOverProductType(); handOverTicket.ProductType = productTypeList; //汇总班次营业模式数据 List modeList = loadHandOverSaleMode(); handOverTicket.Mode = modeList; //组装界面数据 workerNoLable.Text = handOverTicket.WorkNo; workerNameLable.Text = handOverTicket.WorkName; label_startTime.Text = handOverTicket.DatetimeBegin; label_endTime.Text = handOverTicket.DatetimeEnd; label_people.Text = "" + StringUtils.GetInt(handOverTicket.PeopleCount); label_ticketCount.Text = "" + StringUtils.GetInt(handOverTicket.TicketCount); label_amount.Text = "" + StringUtils.GetDecimal(handOverTicket.Amount); label_dealTicketCount.Text = "" + StringUtils.GetInt(handOverTicket.DealTicketCount); label_dealAmount.Text = "" + StringUtils.GetDecimal(handOverTicket.DealAmount); label_backTicketCount.Text = "" + StringUtils.GetInt(handOverTicket.BackTicketCount); label_backAmount.Text = "" + StringUtils.GetDecimal(handOverTicket.BackAmount); label_discountMoney.Text = "" + StringUtils.GetDecimal(handOverTicket.DiscountMoney); label_receivable.Text = "" + StringUtils.GetDecimal(handOverTicket.Receivable); label_maling.Text = "" + StringUtils.GetDecimal(handOverTicket.Maling); label_paid.Text = "" + StringUtils.GetDecimal(handOverTicket.Paid); label_cardCount.Text = "" + StringUtils.GetInt(handOverTicket.CardCount); label_cardRealMoney.Text = "" + StringUtils.GetDecimal(handOverTicket.CardRealMoney); //===退卡余额汇总 accountDestroyCountlabelX.Text = "" + StringUtils.GetInt(handOverTicket.CardRefundCount); accountDestroylabelX.Text = "" + StringUtils.GetDecimal(handOverTicket.CardRefundMoney); label_inmoney.Text = "" + StringUtils.GetDecimal(handOverTicket.Inmoney); label_outmoney.Text = "" + StringUtils.GetDecimal(handOverTicket.Outmoney); label_sumRealMoney.Text = "" + StringUtils.GetDecimal(handOverTicket.SumRealMoney); label_shiftAmount.Text = "" + StringUtils.GetDecimal(handOverTicket.ShiftAmount); label_imprest.Text = "" + StringUtils.GetDecimal(handOverTicket.Imprest); //===班次配送费 label_distributionFee.Text = "" + StringUtils.GetDecimal(handOverTicket.DistributionFee); payListTable.PrimaryGrid.DataSource = handOverTicket.Detail; //未交班人员提醒 string unShiftWorker = getUnShiftWorker(); if (unShiftWorker != null && !"".Equals(unShiftWorker)) { label_unShiftWorker.Text = "特别提醒: " + unShiftWorker + " 未交班"; } else { label_unShiftWorker.Text = ""; } //外送未交单提醒 if (Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_WSUNFINISHNUMNOTIFY, true)) { var wsCount = GetWsUnFinishOrder(); if (wsCount > 0) { var dialog = new DialogForm("外送未交单提醒", string.Format("还有<{0}>单外送单未交单!", wsCount), MessageBoxIcon.Warning, MessageBoxButtons.OK); dialog.TopLevel = true; dialog.ShowDialog(); } } } /// /// 查询未交单外送单数量 /// /// private int GetWsUnFinishOrder() { int result = 0; try { List deliveryList = null; using (var db = Global.Instance.OpenDataBase) { deliveryList = db.Fetch(@"where status != @0 order by createDate", 2); } if (deliveryList.Count > 0) { result = deliveryList.Count; } } catch (Exception ex) { LOGGER.Error(ex, "交班检查外送未交单发生异常"); } return result; } public string getUnShiftWorker() { string unShiftWorker = ""; try { using (var db = Global.Instance.OpenDataBase) { StringBuilder sqlBuld = new StringBuilder(); sqlBuld.Append(" SELECT workerNo,workerName from "); sqlBuld.Append(" pos_business_plan_log "); sqlBuld.Append(" WHERE status = 0 and workerNo<> '{0}' and storeId ='{1}'"); string sql = string.Format(sqlBuld.ToString(), Global.Instance.BusinessPlanLog.WorkerNo, Global.Instance.BusinessPlanLog.StoreId); List businessPlanLogList = db.Query(sql).ToList(); foreach (BusinessPlanLog entity in businessPlanLogList) { unShiftWorker = unShiftWorker + entity.WorkerNo + "(" + entity.WorkerName + ")" + ","; } if (unShiftWorker != null && !"".Equals(unShiftWorker)) { unShiftWorker = unShiftWorker.Substring(0, unShiftWorker.Length - 1); } } } catch (Exception ex) { LOGGER.Error(ex); } return unShiftWorker; } private void OnControlBoxCloseClick(object sender, EventArgs e) { OnCloseTouchClick(sender, e); } private void OnCloseTouchClick(object sender, EventArgs e) { Global.isHandOver = false; //先关闭父窗体 if (this.Owner != null) { this.Owner.Close(); } //再关闭当前窗体 this.Close(); } private void ButtonCancel_Click(object sender, EventArgs e) { OnCloseTouchClick(sender, e); } public List loadHandOverPay() { List list = new List(); try { using (var db = Global.Instance.OpenDataBase) { //第一步汇总各营业模式下的支付方式总金额 StringBuilder sqlBuld = new StringBuilder(); sqlBuld.Append(" select count(a.id) as count,round(sum(a.amount),2) as money,a.no as payModeNo,a.name as payModeName,b.orderType as busMode from pos_order_pay a "); sqlBuld.Append(" left join pos_order b on a.orderId = b.id "); sqlBuld.Append(" where b.workerNo = '{0}' "); sqlBuld.Append(" and b.shiftNo = '{1}' "); sqlBuld.Append(" and b.storeId = '{2}' "); sqlBuld.Append(" and b.orderStatus in (0, 2, 4 ) "); sqlBuld.Append(" GROUP BY a.no , b.orderType "); string sql = string.Format(sqlBuld.ToString(), Global.Instance.BusinessPlanLog.WorkerNo, Global.Instance.BusinessPlanLog.No, Global.Instance.BusinessPlanLog.StoreId); List handOverPayList = db.Query(sql).ToList(); foreach (HandOverPay handOverPay in handOverPayList) { handOverPay.BusType = 0;//销售 list.Add(handOverPay); } //第二步汇总充值各支付下的总金额 sqlBuld = new StringBuilder(); sqlBuld.Append(" select a.payNo as payModeNo,a.payName as payModeName,count(a.payNo) as count,round(sum(a.amount),2) AS money from pos_card_recharge_pay a "); sqlBuld.Append(" left join pos_card_recharge b on a.rechargeId = b.id "); sqlBuld.Append(" where b.workerNo = '{0}' "); sqlBuld.Append(" and b.planNo = '{1}' and b.storeId = '{2}' "); sqlBuld.Append(" and rechargeStatus = 2 "); sqlBuld.Append(" group by a.payNo "); sql = string.Format(sqlBuld.ToString(), Global.Instance.BusinessPlanLog.WorkerNo, Global.Instance.BusinessPlanLog.No, Global.Instance.BusinessPlanLog.StoreId); List handOverRechargePayList = db.Query(sql).ToList(); foreach (HandOverPay handOverPay in handOverRechargePayList) { handOverPay.BusMode = -1; handOverPay.BusType = 1;//充值 list.Add(handOverPay); } //第三步汇总礼品卡销售各支付下的总金额 sqlBuld = new StringBuilder(); sqlBuld.Append(" select a.payNo as payModeNo,a.payName as payModeName,count(a.payNo) as count,round(sum(a.amount),2) AS money from pos_card_sale_pay a "); sqlBuld.Append(" left join pos_card_sale b on a.ticketId = b.id "); sqlBuld.Append(" where b.workerNo = '{0}' "); sqlBuld.Append(" and b.shiftNo = '{1}' and b.storeId = '{2}' "); sqlBuld.Append(" group by a.payNo "); sql = string.Format(sqlBuld.ToString(), Global.Instance.BusinessPlanLog.WorkerNo, Global.Instance.BusinessPlanLog.No, Global.Instance.BusinessPlanLog.StoreId); List handOverSalePayList = db.Query(sql).ToList(); foreach (HandOverPay handOverPay in handOverSalePayList) { handOverPay.BusMode = -1; handOverPay.BusType = 1;//充值 list.Add(handOverPay); } } } catch (Exception ex) { LOGGER.Error(ex); } return list; } /// /// 销售分析 /// zhangy 2019-12-11 Add /// 重写的方法 /// /// public List loadHandOverProduct() { List list = new List(); try { StringBuilder sqlBuld = new StringBuilder(); sqlBuld.Append(" SELECT a.typeId AS typeId, "); sqlBuld.Append(" ifnull(a.typeName,'') AS typeName, ifnull(a.productName,'') AS productName,a.specName as specName, "); sqlBuld.Append(" a.productNo AS productNo,round(SUM(a.quantity - a.rquantity),2) AS count,"); sqlBuld.Append(" round(sum(case when a.isSuit = 3 then a.quantity else 0 end), 2) as suitQuantity,"); sqlBuld.Append(" round(sum(case when a.isSuit != 3 then a.totalReceivableAmount else 0 end),2) as amount "); sqlBuld.Append(" FROM pos_order_item a "); sqlBuld.Append(" left join pos_order b on a.orderId = b.id "); sqlBuld.Append(" WHERE b.workerNo = '{0}' "); sqlBuld.Append(" and b.shiftNo = '{1}' "); sqlBuld.Append(" and b.storeId = '{2}' "); sqlBuld.Append(" and b.orderStatus in (0, 2, 4) "); sqlBuld.Append(" GROUP BY a.productId , a.specId"); sqlBuld.Append(" ORDER BY a.typeId,a.productNo "); string sql = string.Format(sqlBuld.ToString(), Global.Instance.BusinessPlanLog.WorkerNo, Global.Instance.BusinessPlanLog.No, Global.Instance.BusinessPlanLog.StoreId); List handOverProductList = new List(); using (var db = Global.Instance.OpenDataBase) { handOverProductList = db.Query(sql).ToList(); } decimal sumCount = 0.00M; decimal sumSuitQuantity = 0.00M; decimal sumAmount = 0.00M; List> result = new List>(); handOverProductList = handOverProductList.OrderBy(x => x.TypeId).ToList(); ///分类集合 var typeMap = handOverProductList.GroupBy(g => new { g.TypeId }).Select(group => { var map = new Dictionary(); map.Add("type", 3); //zhangy 添加typeId,为单品遍历提供条件数据 map.Add("typeId", group.Select(o => o.TypeId).First()); map.Add("name", group.Select(o => (o.TypeName == null ? "" : o.TypeName)).First()); map.Add("count", group.Sum(o => o.Count)); map.Add("suitQuantity", group.Sum(o => o.SuitQuantity)); map.Add("amount", group.Sum(o => o.Amount)); return map; }).ToList(); //通过分类遍历菜品 foreach (var item in typeMap) { result.Add(item); var typeId = item["typeId"]; decimal count = 0.00M; decimal suitQuantity = 0.00M; decimal amount = 0.00M; //查询指定分类ID的全部菜品 var dishs = handOverProductList.FindAll(x => x.TypeId.Equals(typeId)).OrderBy(x => x.ProductNo).ToList(); ///符合条件的菜品按照品名聚合,品名相同的菜品合并为一行数据 ///2019-12-11 zhangy Edit 按照品名+规格名的方式聚合,确保相同品名,不同规格名,显示为独立一行菜品 var dishMap = dishs.GroupBy(g => new { g.ProductName, g.SpecName }).Select(group => { var map = new Dictionary(); map.Add("type", 0); string sepcName = group.Select(o => (o.SpecName == null ? "" : o.SpecName)).First(); string productName = group.Select(o => (o.ProductName == null ? "" : o.ProductName)).First(); if (string.IsNullOrEmpty(sepcName)) { map.Add("name", productName); } else { map.Add("name", productName + "(" + sepcName + ")"); } map.Add("count", group.Sum(o => o.Count)); map.Add("suitQuantity", group.Sum(o => o.SuitQuantity)); map.Add("amount", group.Sum(o => o.Amount)); return map; }).ToList(); foreach (var dish in dishMap) { result.Add(dish); count += Convert.ToDecimal(dish["count"].ToString()); suitQuantity += Convert.ToDecimal(dish["suitQuantity"].ToString()); amount += Convert.ToDecimal(dish["amount"].ToString()); sumCount += Convert.ToDecimal(dish["count"].ToString()); sumSuitQuantity += Convert.ToDecimal(dish["suitQuantity"].ToString()); sumAmount += Convert.ToDecimal(dish["amount"].ToString()); } var seriesMap = new Dictionary(); seriesMap.Add("type", 1); seriesMap.Add("name", "小计"); seriesMap.Add("count", count); seriesMap.Add("suitQuantity", suitQuantity); seriesMap.Add("amount", amount); result.Add(seriesMap); } Dictionary sumMap = new Dictionary(); sumMap.Add("name", "销售"); sumMap.Add("type", 2); sumMap.Add("count", sumCount); sumMap.Add("suitQuantity", sumSuitQuantity); sumMap.Add("amount", sumAmount); result.Add(sumMap); foreach (Dictionary map in result) { HandOverProduct entity = new HandOverProduct(); entity.Type = StringUtils.GetInt(map["type"]); entity.Name = StringUtils.GetString(map["name"]); entity.Count = StringUtils.GetDecimal(map["count"]); entity.SuitQuantity = StringUtils.GetDecimal(map["suitQuantity"]); entity.Amount = StringUtils.GetDecimal(map["amount"]); list.Add(entity); } } catch (Exception ex) { LOGGER.Error(ex, "菜品分析数据处理异常"); } return list; } //public List loadHandOverProduct() //{ // List handOverProductList = null; // List list = null; // try // { // using (var db = Global.Instance.OpenDataBase) // { // StringBuilder sqlBuld = new StringBuilder(); // sqlBuld.Append(" SELECT a.typeId AS typeId, "); // sqlBuld.Append(" ifnull(a.typeName,'') AS typeName, ifnull(a.productName,'') AS productName,a.specName as specName, "); // sqlBuld.Append(" a.productNo AS productNo,round(SUM(a.quantity - a.rquantity),2) AS count,"); // sqlBuld.Append(" round(sum(case when a.isSuit = 3 then a.quantity else 0 end), 2) as suitQuantity,"); // sqlBuld.Append(" round(sum(case when a.isSuit != 3 then a.totalReceivableAmount else 0 end),2) as amount "); // sqlBuld.Append(" FROM pos_order_item a "); // sqlBuld.Append(" left join pos_order b on a.orderId = b.id "); // sqlBuld.Append(" WHERE b.workerNo = '{0}' "); // sqlBuld.Append(" and b.shiftNo = '{1}' "); // sqlBuld.Append(" and b.storeId = '{2}' "); // sqlBuld.Append(" and b.orderStatus in (0, 2, 4) "); // sqlBuld.Append(" GROUP BY a.productId , a.specId"); // sqlBuld.Append(" ORDER BY a.typeId,a.productNo "); // string sql = string.Format(sqlBuld.ToString(), Global.Instance.BusinessPlanLog.WorkerNo, Global.Instance.BusinessPlanLog.No, Global.Instance.BusinessPlanLog.StoreId); // handOverProductList = db.Query(sql).ToList(); // string seriesId = ""; // string seriesName = ""; // Dictionary seriesMap = new Dictionary(); // Dictionary typeMap = new Dictionary(); // decimal count = 0.00M; // decimal suitQuantity = 0.00M; // decimal amount = 0.00M; // decimal sumCount = 0.00M; // decimal sumSuitQuantity = 0.00M; // decimal sumAmount = 0.00M; // int i = 0; // List> result = new List>(); // int listLength = handOverProductList.Count; // foreach (HandOverProduct product in handOverProductList) // { // string typeId = product.TypeId; // if (!seriesId.Equals(typeId)) // { // // 分类改变的时候把分类加入列表 // if (i != 0) // { // seriesMap.Add("type", 1); // seriesMap.Add("name", seriesName); // seriesMap.Add("count", count); // seriesMap.Add("suitQuantity", suitQuantity); // seriesMap.Add("amount", amount); // result.Add(seriesMap); // //分类改变时,清除缓存 // typeMap = new Dictionary(); // } // seriesMap = new Dictionary(); // count = 0.00M; // suitQuantity = 0.00M; // amount = 0.00M; // seriesId = typeId; // seriesName = product.TypeName; // } // count += product.Count; // suitQuantity += product.SuitQuantity; // amount += product.Amount; // sumCount += product.Count; // sumSuitQuantity += product.SuitQuantity; // sumAmount += product.Amount; // //开始先加入分类名称 // if (!typeMap.ContainsKey("name") || !typeMap["name"].Equals(product.TypeName)) // { // typeMap.Add("type", 3); // typeMap.Add("name", product.TypeName); // typeMap.Add("count", ""); // typeMap.Add("suitQuantity", ""); // typeMap.Add("amount", ""); // result.Add(typeMap); // } // // 菜品加入列表 // Dictionary dishMap = new Dictionary(); // dishMap.Add("type", 0); // if (product.SpecName != null && !"".Equals(product.SpecName)) // { // dishMap.Add("name", product.ProductName + "(" + product.SpecName + ")"); // } // else // { // dishMap.Add("name", product.ProductName); // } // dishMap.Add("count", product.Count); // dishMap.Add("suitQuantity", product.SuitQuantity); // dishMap.Add("amount", product.Amount); // result.Add(dishMap); // i = i + 1; // if (i == listLength) // { // seriesMap.Add("type", 1); // seriesMap.Add("name", seriesName); // seriesMap.Add("count", count); // seriesMap.Add("suitQuantity", suitQuantity); // seriesMap.Add("amount", amount); // result.Add(seriesMap); // //分类改变时,清除缓存 // typeMap = new Dictionary(); // } // } // Dictionary sumMap = new Dictionary(); // sumMap.Add("name", "销售"); // sumMap.Add("type", 2); // sumMap.Add("count", sumCount); // sumMap.Add("suitQuantity", sumSuitQuantity); // sumMap.Add("amount", sumAmount); // result.Add(sumMap); // list = new List(); // foreach (Dictionary map in result) // { // HandOverProduct entity = new HandOverProduct(); // entity.Type = StringUtils.GetInt(map["type"]); // entity.Name = StringUtils.GetString(map["name"]); // entity.Count = StringUtils.GetDecimal(map["count"]); // entity.SuitQuantity = StringUtils.GetDecimal(map["suitQuantity"]); // entity.Amount = StringUtils.GetDecimal(map["amount"]); // list.Add(entity); // } // } // } // catch (Exception ex) // { // LOGGER.Error(ex); // } // return list; //} /// /// 汇总各营业模式的次数和金额 /// /// public List loadHandOverSaleMode() { List list = null; try { using (var db = Global.Instance.OpenDataBase) { StringBuilder sqlBuld = new StringBuilder(); sqlBuld.Append(" select orderType ,count(id) as count,round(sum(receivableAmount),2) as amount from pos_order "); sqlBuld.Append(" where workerNo = '{0}' "); sqlBuld.Append(" and shiftNo = '{1}' "); sqlBuld.Append(" and storeId = '{2}' "); sqlBuld.Append(" and orderStatus in (0, 2, 4) "); sqlBuld.Append(" GROUP BY orderType "); string sql = string.Format(sqlBuld.ToString(), Global.Instance.BusinessPlanLog.WorkerNo, Global.Instance.BusinessPlanLog.No, Global.Instance.BusinessPlanLog.StoreId); list = db.Query(sql).ToList(); } } catch (Exception ex) { LOGGER.Error(ex); } return list; } /// /// 获取交班优惠 /// /// public List loadHandOverInfo() { List list = null; try { using (var db = Global.Instance.OpenDataBase) { StringBuilder sqlBuld = new StringBuilder(); sqlBuld.Append(" select a.promotionType,count(a.id) as count,round(sum(a.discountAmount),2) as amount from pos_order_item_promotion a "); sqlBuld.Append(" left join pos_order b on a.tradeNo = b.tradeNo "); sqlBuld.Append(" where a.promotionType<> '50' "); sqlBuld.Append(" and b.workerNo = '{0}' "); sqlBuld.Append(" and b.shiftNo = '{1}' "); sqlBuld.Append(" and b.storeId = '{2}' "); sqlBuld.Append(" and b.orderStatus in (0, 2, 4) "); sqlBuld.Append(" GROUP BY a.promotionType "); string sql = string.Format(sqlBuld.ToString(), Global.Instance.BusinessPlanLog.WorkerNo, Global.Instance.BusinessPlanLog.No, Global.Instance.BusinessPlanLog.StoreId); list = db.Query(sql).ToList(); } } catch (Exception ex) { LOGGER.Error(ex); } return list; } //汇总销售分类 public List loadHandOverProductType() { List list = null; try { using (var db = Global.Instance.OpenDataBase) { StringBuilder sqlBuld = new StringBuilder(); sqlBuld.Append(" select a.typeId AS typeId,a.typeName AS typeName,round(SUM(a.quantity - a.rquantity),2) AS count, "); sqlBuld.Append(" round(SUM(a.totalReceivableAmount),2) AS amount from pos_order_item a "); sqlBuld.Append(" left join pos_order b on a.tradeNo = b.tradeNo "); sqlBuld.Append(" where b.workerNo = '{0}' "); sqlBuld.Append(" and b.shiftNo = '{1}' "); sqlBuld.Append(" and b.storeId = '{2}' "); sqlBuld.Append(" and a.isSuit in (1, 2) "); sqlBuld.Append(" and b.orderStatus in (0, 2, 4) "); sqlBuld.Append(" GROUP BY a.typeId "); sqlBuld.Append(" ORDER BY a.typeId"); string sql = string.Format(sqlBuld.ToString(), Global.Instance.BusinessPlanLog.WorkerNo, Global.Instance.BusinessPlanLog.No, Global.Instance.BusinessPlanLog.StoreId); list = db.Query(sql).ToList(); } } catch (Exception ex) { LOGGER.Error(ex); } return list; } public HandOverTicket loadData() { HandOverTicket handOverTicket = null; try { using (var db = Global.Instance.OpenDataBase) { StringBuilder sqlBuld = new StringBuilder(); // 第一步汇总主单数据 sqlBuld.Append(" select round(sum(people),2) as peopleCount, "); sqlBuld.Append(" round(sum(case when orderStatus IN (0,2,4) then 1 else 0 end),2) as ticketCount, "); sqlBuld.Append(" round(sum(case when orderStatus IN (0,2,4) then amount else 0 end),2) as amount, "); sqlBuld.Append(" round(sum(case when orderStatus =4 then 1 else 0 end),2) as dealTicketCount , "); sqlBuld.Append(" round(sum(case when orderStatus =4 then amount else 0 end),2) as dealAmount , "); sqlBuld.Append(" round(sum(case when orderStatus = 2 then 1 else 0 end),2) as backTicketCount, "); sqlBuld.Append(" round(sum(case when orderStatus = 2 then amount else 0 end),2) as backAmount, "); sqlBuld.Append(" round(sum(case when orderStatus IN (0,2,4) then discountAmount else 0 end),2) as discountMoney, "); sqlBuld.Append(" round(sum(case when orderStatus IN (0,2,4) then receivableAmount else 0 end),2) as receivable, "); sqlBuld.Append(" round(sum(case when orderStatus IN (0,2,4) then malingAmount else 0 end),2) as maling "); sqlBuld.Append(" from pos_order where "); sqlBuld.Append(" workerNo = '{0}' and shiftNo = '{1}' "); sqlBuld.Append(" and storeId = '{2}' "); string sql = string.Format(sqlBuld.ToString(), Global.Instance.BusinessPlanLog.WorkerNo, Global.Instance.BusinessPlanLog.No, Global.Instance.BusinessPlanLog.StoreId); handOverTicket = db.FirstOrDefault(sql); if (handOverTicket == null) { handOverTicket = new HandOverTicket(); handOverTicket.PeopleCount = 0; handOverTicket.TicketCount = 0; handOverTicket.Amount = 0.00M; handOverTicket.DealTicketCount = 0; handOverTicket.DealAmount = 0.00M; handOverTicket.BackTicketCount = 0; handOverTicket.BackAmount = 0.00M; handOverTicket.DiscountMoney = 0.00M; handOverTicket.Receivable = 0.00M; handOverTicket.Maling = 0.00M; } handOverTicket.TenantId = Global.Instance.BusinessPlanLog.TenantId; handOverTicket.WorkId = Global.Instance.BusinessPlanLog.WorkerId; handOverTicket.WorkNo = Global.Instance.BusinessPlanLog.WorkerNo; handOverTicket.WorkName = Global.Instance.BusinessPlanLog.WorkerName; handOverTicket.ShiftName = Global.Instance.BusinessPlanLog.Name; handOverTicket.ShiftNo = Global.Instance.BusinessPlanLog.No; handOverTicket.StoreId = Global.Instance.BusinessPlanLog.StoreId; handOverTicket.StoreNo = Global.Instance.BusinessPlanLog.StoreNo; handOverTicket.StoreName = Global.Instance.Authc.StoreName; handOverTicket.AcceptWorkerNo = Global.Instance.BusinessPlanLog.WorkerNo; handOverTicket.DatetimeBegin = Global.Instance.BusinessPlanLog.LoginTime; handOverTicket.DatetimeEnd = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); handOverTicket.DatetimeShift = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); handOverTicket.PosNo = Global.Instance.Authc.PosNo; handOverTicket.DeviceIp = DeviceUtils.Instance.IPAddress; handOverTicket.DeviceMac = DeviceUtils.Instance.MacAddress; handOverTicket.DeviceName = DeviceUtils.Instance.ComputerName; // 第1.5部汇总电子券金额 sqlBuld = new StringBuilder(); sqlBuld.Append(" select sum(a.discountAmount) as couponDiscountMoney "); sqlBuld.Append(" from pos_order_item_promotion a "); sqlBuld.Append(" left join pos_order b on a.orderId = b.id "); sqlBuld.Append(" where b.workerNo = '{0}' "); sqlBuld.Append(" and b.shiftNo = '{1}' "); sqlBuld.Append(" and b.storeId = '{2}' "); sqlBuld.Append(" and b.orderStatus in (0, 2, 4) "); sqlBuld.Append(" and a.promotionType in(80, 81, 82) "); sql = string.Format(sqlBuld.ToString(), Global.Instance.BusinessPlanLog.WorkerNo, Global.Instance.BusinessPlanLog.No, Global.Instance.BusinessPlanLog.StoreId); HandOverTicket storeDiscount = db.FirstOrDefault(sql); if (storeDiscount == null) { handOverTicket.CouponDiscountMoney = 0; handOverTicket.OtherDiscountMoney = handOverTicket.DiscountMoney; } else { handOverTicket.CouponDiscountMoney = storeDiscount.CouponDiscountMoney; handOverTicket.OtherDiscountMoney = handOverTicket.DiscountMoney - storeDiscount.CouponDiscountMoney; } // 第二部汇总卡务金额 sqlBuld = new StringBuilder(); sqlBuld.Append(" select "); sqlBuld.Append(" round(sum(money),2) as cardRealMoney ,count(id) as cardCount from pos_card_recharge where"); sqlBuld.Append(" workerNo = '{0}' and planNo = '{1}' "); sqlBuld.Append(" and storeId = '{2}' "); sqlBuld.Append(" and rechargeStatus = 2 "); sql = string.Format(sqlBuld.ToString(), Global.Instance.BusinessPlanLog.WorkerNo, Global.Instance.BusinessPlanLog.No, Global.Instance.BusinessPlanLog.StoreId); HandOverTicket storeCardRecharge = db.FirstOrDefault(sql); if (storeCardRecharge == null) { handOverTicket.CardCount = 0; handOverTicket.CardRealMoney = 0.00M; } else { handOverTicket.CardCount = storeCardRecharge.CardCount; handOverTicket.CardRealMoney = storeCardRecharge.CardRealMoney; } // 第二步的扩展汇总礼品卡销售金额 sqlBuld = new StringBuilder(); sqlBuld.Append(" select "); sqlBuld.Append(" round(sum(money),2) as cardRealMoney ,count(id) as cardCount from pos_card_sale where"); sqlBuld.Append(" workerNo = '{0}' and shiftNo = '{1}' "); sqlBuld.Append(" and storeId = '{2}' "); sqlBuld.Append(" and payStatus=1 "); sql = string.Format(sqlBuld.ToString(), Global.Instance.BusinessPlanLog.WorkerNo, Global.Instance.BusinessPlanLog.No, Global.Instance.BusinessPlanLog.StoreId); HandOverTicket storeCardSale = db.FirstOrDefault(sql); if (storeCardSale == null) { handOverTicket.CardCount = handOverTicket.CardCount; handOverTicket.CardRealMoney = handOverTicket.CardRealMoney; } else { handOverTicket.CardCount = handOverTicket.CardCount + storeCardSale.CardCount; handOverTicket.CardRealMoney = handOverTicket.CardRealMoney + storeCardSale.CardRealMoney; } // 第三部汇总非营业收入支出金额 sqlBuld = new StringBuilder(); sqlBuld.Append(" select "); sqlBuld.Append(" round(sum(case when type=1 then money else 0 end),2) as outmoney, "); sqlBuld.Append(" round(sum(case when type=2 then money else 0 end),2) as inmoney "); sqlBuld.Append(" from pos_store_cost_revenue where "); sqlBuld.Append(" workNo = '{0}' and shiftNo = '{1}' "); sqlBuld.Append(" and storeId = '{2}' "); sql = string.Format(sqlBuld.ToString(), Global.Instance.BusinessPlanLog.WorkerNo, Global.Instance.BusinessPlanLog.No, Global.Instance.BusinessPlanLog.StoreId); HandOverTicket storeCostRevenue = db.FirstOrDefault(sql); if (storeCostRevenue == null) { handOverTicket.Inmoney = 0.00M; handOverTicket.Outmoney = 0.00M; } else { handOverTicket.Inmoney = storeCostRevenue.Inmoney; handOverTicket.Outmoney = storeCostRevenue.Outmoney; } // 查询备用金 handOverTicket.Imprest = Global.Instance.BusinessPlanLog.Imprest; // 第五步汇总卡务退卡次数金额 sqlBuld = new StringBuilder(); sqlBuld.Append(" select "); sqlBuld.Append(" round(sum(refundMoney),2) as cardRefundMoney ,count(id) as cardRefundCount from pos_card_account_destroy where"); sqlBuld.Append(" workerNo = '{0}' and planNo = '{1}' "); sqlBuld.Append(" and storeId = '{2}' "); sql = string.Format(sqlBuld.ToString(), Global.Instance.BusinessPlanLog.WorkerNo, Global.Instance.BusinessPlanLog.No, Global.Instance.BusinessPlanLog.StoreId); HandOverTicket storeCardRefund = db.FirstOrDefault(sql); if (storeCardRefund == null) { handOverTicket.CardRefundCount = 0; handOverTicket.CardRefundMoney = 0.00M; } else { handOverTicket.CardRefundCount = storeCardRefund.CardRefundCount; handOverTicket.CardRefundMoney = storeCardRefund.CardRefundMoney; } //第五步扩展礼品卡销售退卡金额次数 sqlBuld = new StringBuilder(); sqlBuld.Append(" select "); sqlBuld.Append(" round(sum(money),2) as cardRefundMoney ,count(id) as cardRefundCount from pos_card_sale where"); sqlBuld.Append(" workerNo = '{0}' and shiftNo = '{1}' "); sqlBuld.Append(" and storeId = '{2}' "); sqlBuld.Append(" and payStatus=2 "); sql = string.Format(sqlBuld.ToString(), Global.Instance.BusinessPlanLog.WorkerNo, Global.Instance.BusinessPlanLog.No, Global.Instance.BusinessPlanLog.StoreId); HandOverTicket storeCardSaleRefund = db.FirstOrDefault(sql); if (storeCardSaleRefund == null) { handOverTicket.CardRefundCount = handOverTicket.CardRefundCount; handOverTicket.CardRefundMoney = handOverTicket.CardRefundMoney; } else { handOverTicket.CardRefundCount = handOverTicket.CardRefundCount + storeCardSaleRefund.CardRefundCount; handOverTicket.CardRefundMoney = handOverTicket.CardRefundMoney + System.Math.Abs(storeCardSaleRefund.CardRefundMoney); } //第六步汇总支付虚实收 sqlBuld = new StringBuilder(); sqlBuld.Append(" select round(sum(case when a.incomeFlag = 1 then a.amount else 0 end),2) as realMoney , "); sqlBuld.Append(" round(sum(case when a.incomeFlag = 0 then a.amount else 0 end), 2) as virtualMoney "); sqlBuld.Append(" from pos_order_pay a "); sqlBuld.Append(" left join pos_order b on a.orderId = b.id where b.workerNo = '{0}' "); sqlBuld.Append(" and b.shiftNo = '{1}' and b.storeId = '{2}' "); sqlBuld.Append(" and b.orderStatus in (0, 2, 4) "); sql = string.Format(sqlBuld.ToString(), Global.Instance.BusinessPlanLog.WorkerNo, Global.Instance.BusinessPlanLog.No, Global.Instance.BusinessPlanLog.StoreId); HandOverTicket storeVirtualRealMoney = db.FirstOrDefault(sql); if (storeVirtualRealMoney == null) { handOverTicket.RealMoney = 0.00M; handOverTicket.VirtualMoney = 0.00M; } else { handOverTicket.RealMoney = storeVirtualRealMoney.RealMoney; handOverTicket.VirtualMoney = storeVirtualRealMoney.VirtualMoney; } //第七步获取门店支付配送费 sqlBuld = new StringBuilder(); sqlBuld.Append(" select "); sqlBuld.Append(" round(sum(case when status=0 then distributionFee else 0 end),2) - round(sum(case when status=1 then distributionFee else 0 end),2) as distributionFee "); sqlBuld.Append(" from pos_wx_waimai_order where "); sqlBuld.Append(" workerNo = '{0}' and shiftNo = '{1}' "); sqlBuld.Append(" and storeId = '{2}' "); sqlBuld.Append(" and isIncome = '1' "); sql = string.Format(sqlBuld.ToString(), Global.Instance.BusinessPlanLog.WorkerNo, Global.Instance.BusinessPlanLog.No, Global.Instance.BusinessPlanLog.StoreId); HandOverTicket wxWaimaiOrder = db.FirstOrDefault(sql); if (wxWaimaiOrder == null) { handOverTicket.DistributionFee = 0.00M; } else { handOverTicket.DistributionFee = wxWaimaiOrder.DistributionFee; } } } catch (Exception ex) { LOGGER.Error(ex); } return handOverTicket; } public List getHandOverDetail() { List sumList = new List(); try { using (var db = Global.Instance.OpenDataBase) { Dictionary payTypeMap = new Dictionary(); Dictionary onlinePayTypeMap = new Dictionary(); // 第一步销售收入 StringBuilder sqlBuf = new StringBuilder(); sqlBuf.Append(" select a.no as payModeNo,a.name as payModeName,count(a.no) as count ,round(sum(a.amount),2) as money ,b.orderType as busMode from pos_order_pay a "); sqlBuf.Append(" left join pos_order b on a.orderId = b.id"); sqlBuf.Append(" where "); sqlBuf.Append(" b.workerNo ='{0}' "); sqlBuf.Append(" and b.shiftNo ='{1}' "); sqlBuf.Append(" and b.storeId = '{2}' "); sqlBuf.Append(" and b.orderStatus in (0,2,4) "); sqlBuf.Append(" group by a.no ,b.orderType"); //,暂时去除了,支付编号重复,比如:22-美团外卖,堂食和外卖订单有使用的情况 string sql = string.Format(sqlBuf.ToString(), Global.Instance.BusinessPlanLog.WorkerNo, Global.Instance.BusinessPlanLog.No, Global.Instance.BusinessPlanLog.StoreId); List list = db.Query(sql).ToList(); if (list == null) { list = new List(); } var offlineList = list.FindAll(x => (x.BusMode != 4 && x.BusMode != 5 && x.BusMode != 7)); if (offlineList == null) { offlineList = new List(); } for (int i = 0; i < offlineList.Count(); i++) { HandOverDetail handOverDetail = offlineList[i]; handOverDetail.Index = (i + 1); payTypeMap.Add(handOverDetail.PayModeNo, handOverDetail.PayModeName); } var onlineList = list.FindAll(x => (x.BusMode == 4 || x.BusMode == 5 || x.BusMode == 7)); if (onlineList == null) { onlineList = new List(); } for (int i = 0; i < onlineList.Count(); i++) { HandOverDetail handOverDetail = onlineList[i]; handOverDetail.Index = offlineList.Count + (i + 1); onlinePayTypeMap.Add(handOverDetail.PayModeNo, handOverDetail.PayModeName); } // 第二部汇总卡务金额 sqlBuf = new StringBuilder(); sqlBuf.Append(" select a.payNo as payModeNo,a.payName as payModeName,count(a.payNo) as count,round(sum(a.amount),2) AS money from pos_card_recharge_pay a "); sqlBuf.Append(" left join pos_card_recharge b on a.rechargeId = b.id "); sqlBuf.Append(" where b.workerNo = '{0}' "); sqlBuf.Append(" and b.planNo = '{1}' and b.storeId = '{2}' "); sqlBuf.Append(" and rechargeStatus = 2 "); sqlBuf.Append(" group by a.payNo "); sql = string.Format(sqlBuf.ToString(), Global.Instance.BusinessPlanLog.WorkerNo, Global.Instance.BusinessPlanLog.No, Global.Instance.BusinessPlanLog.StoreId); List listDetail = db.Query(sql).ToList(); foreach (HandOverDetail cardRechargeDetail in listDetail) { //payTypeMap[cardRechargeDetail.PayModeNo] = cardRechargeDetail.PayModeName; if (payTypeMap.ContainsKey(cardRechargeDetail.PayModeNo)) { payTypeMap[cardRechargeDetail.PayModeNo] = cardRechargeDetail.PayModeName; } else { payTypeMap.Add(cardRechargeDetail.PayModeNo, cardRechargeDetail.PayModeName); } } //第二步扩展 汇总礼品卡销售金额 sqlBuf = new StringBuilder(); sqlBuf.Append(" select a.payNo as payModeNo,a.payName as payModeName,count(a.payNo) as count,round(sum(a.amount),2) AS money from pos_card_sale_pay a "); sqlBuf.Append(" left join pos_card_sale b on a.ticketId = b.id "); sqlBuf.Append(" where b.workerNo = '{0}' "); sqlBuf.Append(" and b.shiftNo = '{1}' and b.storeId = '{2}' "); sqlBuf.Append(" group by a.payNo "); sql = string.Format(sqlBuf.ToString(), Global.Instance.BusinessPlanLog.WorkerNo, Global.Instance.BusinessPlanLog.No, Global.Instance.BusinessPlanLog.StoreId); List listSaleDetail = db.Query(sql).ToList(); foreach (HandOverDetail cardSaleDetail in listSaleDetail) { //payTypeMap[cardRechargeDetail.PayModeNo] = cardRechargeDetail.PayModeName; if (payTypeMap.ContainsKey(cardSaleDetail.PayModeNo)) { payTypeMap[cardSaleDetail.PayModeNo] = cardSaleDetail.PayModeName; } else { payTypeMap.Add(cardSaleDetail.PayModeNo, cardSaleDetail.PayModeName); } } // 第三部汇总卡务退款金额 sqlBuf = new StringBuilder(); sqlBuf.Append(" select a.payNo as payModeNo,a.payName as payModeName,count(a.payNo) as count,round(sum(a.refundMoney),2) AS money from pos_card_account_destroy a "); sqlBuf.Append(" where a.workerNo = '{0}' "); sqlBuf.Append(" and a.planNo = '{1}' and a.storeId = '{2}' "); sqlBuf.Append(" group by a.payNo "); sql = string.Format(sqlBuf.ToString(), Global.Instance.BusinessPlanLog.WorkerNo, Global.Instance.BusinessPlanLog.No, Global.Instance.BusinessPlanLog.StoreId); List listRefundDetail = db.Query(sql).ToList(); foreach (HandOverDetail cardRefundDetail in listRefundDetail) { if (payTypeMap.ContainsKey(cardRefundDetail.PayModeNo)) { payTypeMap[cardRefundDetail.PayModeNo] = cardRefundDetail.PayModeName; } else { payTypeMap.Add(cardRefundDetail.PayModeNo, cardRefundDetail.PayModeName); } } foreach (KeyValuePair payType in payTypeMap) { HandOverDetail sumDetail = new HandOverDetail(); foreach (HandOverDetail handOverDetail in offlineList) { if (payType.Key.Equals(handOverDetail.PayModeNo)) { sumDetail.PayModeNo = handOverDetail.PayModeNo; sumDetail.PayModeName = handOverDetail.PayModeName; sumDetail.Count = handOverDetail.Count; sumDetail.Money = handOverDetail.Money; } } foreach (HandOverDetail cardRechargeDetail in listDetail) { if (payType.Key.Equals(cardRechargeDetail.PayModeNo)) { sumDetail.PayModeNo = cardRechargeDetail.PayModeNo; sumDetail.PayModeName = cardRechargeDetail.PayModeName; sumDetail.CardCount = cardRechargeDetail.Count; sumDetail.CardMoney = cardRechargeDetail.Money; } } foreach (HandOverDetail cardSaleDetail in listSaleDetail) { if (payType.Key.Equals(cardSaleDetail.PayModeNo)) { sumDetail.PayModeNo = cardSaleDetail.PayModeNo; sumDetail.PayModeName = cardSaleDetail.PayModeName; sumDetail.CardCount = sumDetail.CardCount + cardSaleDetail.Count; sumDetail.CardMoney = sumDetail.CardMoney + cardSaleDetail.Money; } } foreach (HandOverDetail cardRefundDetail in listRefundDetail) { if (payType.Key.Equals(cardRefundDetail.PayModeNo)) { sumDetail.PayModeNo = cardRefundDetail.PayModeNo; sumDetail.PayModeName = cardRefundDetail.PayModeName; sumDetail.CardCount = sumDetail.CardCount + cardRefundDetail.Count;//数量合计 sumDetail.CardMoney = sumDetail.CardMoney - cardRefundDetail.Money;//金额相减 } } sumList.Add(sumDetail); } //如果明细里没有01支付方式,需要添加 HandOverDetail detailEntity = sumList.FirstOrDefault(x => "01".Equals(x.PayModeNo)); if (detailEntity == null) { detailEntity = new HandOverDetail(); var payMode = OrderUtils.GetPayMode("01"); detailEntity.PayModeNo = "01"; if (payMode != null) { detailEntity.PayModeName = payMode.Name; } else { detailEntity.PayModeName = "人民币"; } detailEntity.Count = 0; detailEntity.Money = 0.00M; detailEntity.CardCount = 0; detailEntity.CardMoney = 0.00M; sumList.Add(detailEntity); } //zhangy 2020-04-20 Add 线上销售数据 foreach (KeyValuePair payType in onlinePayTypeMap) { HandOverDetail sumDetail = new HandOverDetail(); sumDetail.PaySource = "线上"; sumDetail.BusMode = 7; foreach (HandOverDetail handOverDetail in onlineList) { if (payType.Key.Equals(handOverDetail.PayModeNo)) { sumDetail.PayModeNo = handOverDetail.PayModeNo; sumDetail.PayModeName = handOverDetail.PayModeName; sumDetail.Count = handOverDetail.Count; sumDetail.Money = handOverDetail.Money; } } sumList.Add(sumDetail); } } } catch (Exception ex) { LOGGER.Error(ex); } return sumList; } public void saveHandOver(HandOverTicket entity) { try { lock (Global.Instance.SyncLock) { using (var db = Global.Instance.OpenDataBase) { using (var transaction = db.GetTransaction()) { // 保存主单数据 db.Save(entity); // 保存支付汇总 List detail = entity.Detail; if (detail != null && detail.Count > 0) { foreach (HandOverDetail detailEntity in detail) { db.Save(detailEntity); } } // 保存盘点数据 (茶饮上专用,暂时不做) // 保存交班支付方式明细 List pay = entity.Pay; if (pay != null && pay.Count > 0) { foreach (HandOverPay handOverPay in pay) { db.Save(handOverPay); } } // 交班成功更新登陆状态 string updateSql = "update pos_business_plan_log set status =1, shiftTime ='{0}',isLogin =0 where tenantId = '{1}' and storeId = '{2}' and workerId ='{3}' and posNo = '{4}' and no='{5}' "; string sql = string.Format(updateSql, entity.DatetimeShift, entity.TenantId, entity.StoreId, entity.WorkId, entity.PosNo, entity.ShiftNo); db.Execute(sql); transaction.Complete(); } } } } catch (Exception ex) { LOGGER.Error(ex, "交班明细数据本地保存异常"); } } public void saveHandOverObject(UploadHandoverObject entity) { try { lock (Global.Instance.SyncLock) { using (var db = Global.Instance.OpenDataBase) { using (var transaction = db.GetTransaction()) { // 保存要上传的数据 db.Save(entity); transaction.Complete(); } } } } catch (Exception ex) { LOGGER.Error(ex, "交班单本地保存异常"); } } private void ButtonOk_Click(object sender, EventArgs e) { #region 原始代码 var button = sender as ButtonX; try { button.Enabled = false; if (Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_ISVERIFICATIONORDER)) { int _count = 0; //核销提示 using (var db = Global.Instance.OpenDataBase) { using (var transaction = db.GetTransaction()) { string querySql = "select * from pos_saoma_pay_ticket where payStatus ='{0}'"; querySql = string.Format(querySql, 0); _count = db.Query(querySql).Count(); } } if (_count > 0) { DialogForm dialog = new DialogForm("操作提醒", "您有未核销订单,是否继续交班?", MessageBoxIcon.Warning, MessageBoxButtons.OKCancel); if (DialogResult.OK != dialog.ShowDialog()) { return; } } } var shiftDateTime = DateTime.Now; if (handOverTicket != null) { decimal handsMoney = 0.00M; decimal difMoney = 0.00M; string shiftNo = OrderUtils.Instance.GenerateShiftNo(); handOverTicket.Id = IdWorkerUtils.Instance.NextId(); handOverTicket.No = shiftNo; handOverTicket.Memo = memoTextBox.Text; handOverTicket.ShiftNo = Global.Instance.BusinessPlanLog.No; if (handOverTicket.Detail != null) { foreach (HandOverDetail handOverDetail in handOverTicket.Detail) { handOverDetail.Id = IdWorkerUtils.Instance.NextId(); handOverDetail.TenantId = handOverTicket.TenantId; handOverDetail.BusNo = handOverTicket.No; handOverDetail.PosNo = Global.Instance.Authc.PosNo; handOverDetail.DeviceIp = DeviceUtils.Instance.IPAddress; handOverDetail.DeviceMac = DeviceUtils.Instance.MacAddress; handOverDetail.DeviceName = DeviceUtils.Instance.ComputerName; handOverDetail.HandsMoney = handOverDetail.SumMoney; if ("01".Equals(handOverDetail.PayModeNo)) { handsMoney = handOverDetail.SumMoney + handOverTicket.Inmoney - handOverTicket.Outmoney; //人民币金额计算方式 handOverDetail.HandsMoney = handsMoney; difMoney = 0.00M; } handOverDetail.StoreId = handOverTicket.StoreId; handOverDetail.TicketId = handOverTicket.Id; } } if (handOverTicket.Pay != null) { foreach (HandOverPay handOverPay in handOverTicket.Pay) { handOverPay.Id = IdWorkerUtils.Instance.NextId(); handOverPay.TenantId = handOverTicket.TenantId; handOverPay.BusNo = handOverTicket.No; handOverPay.PosNo = Global.Instance.Authc.PosNo; handOverPay.DeviceIp = DeviceUtils.Instance.IPAddress; handOverPay.DeviceMac = DeviceUtils.Instance.MacAddress; handOverPay.DeviceName = DeviceUtils.Instance.ComputerName; handOverPay.StoreId = handOverTicket.StoreId; handOverPay.TicketId = handOverTicket.Id; } } saveHandOver(handOverTicket); var uploadObject = new UploadHandoverObject(); uploadObject.Id = IdWorkerUtils.Instance.NextId(); uploadObject.TenantId = this.handOverTicket.TenantId; uploadObject.TradeNo = this.handOverTicket.No; uploadObject.SyncStatus = 0; uploadObject.HandOverTicket = this.handOverTicket; uploadObject.PrintStatus = HandOverPrintStatus.WAIT; uploadObject.UploadErrors = 0; uploadObject.PrintTimes = 0; saveHandOverObject(uploadObject); //有要上传的数据 LOGGER.Info("有需要上传的交班数据,isHaveUpLoadShift=true"); Global.isHaveUpLoadShift = true; #region subin 20231025 分账由实时改为交班时分账 splitFrm = new SplitPayUploadForm(0, 1000); this.Invoke(new EventJisuan(SplitHandle), sender, e); #endregion ////刷新界面??? ////交班打印 //this.ShowToastNotify(this, "开始打印"); ////构建收银小票模版参数 //handOverTicket.PrintType = ""; //handOverTicket.handMoney = handsMoney;//手工金额 //handOverTicket.diffMoney = difMoney;//差异金额 //bool ShiftPrint = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_SHIFPRINT, false); //LOGGER.Info("-------------------构建小票参数------------------------------"); //LOGGER.Info(JsonUtils.Serialize(this.handOverTicket)); //var vars = ShiftHelper.BuilderTicketVariable(handOverTicket, ShiftPrint, false); //LOGGER.Info("-------------------------------------------------"); ////交班开钱箱 //bool openCashbox = false; //if (Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_ISSHIFTOPENCASH)) //{ // openCashbox = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_ISSHIFTOPENCASH); //} //Tuple result = ShiftHelper.PrinterTicket("交班汇总", vars, true, openCashbox); //this.ShowToastNotify(this, string.Format("{0}", result.Item2)); ////是否交班 //Global.isHandOver = false; //StoreBusinessUtils.SaveOperationLog("103", "班次:" + handOverTicket.ShiftNo); ////关闭当前秤 //MsgEvent.Send(Constant.CURRENTSTEELYARD_STATUS_CHANGE, "close"); ////两秒退出系统 //System.Threading.Thread.Sleep(2000); //OnCloseTouchClick(sender, e); ////交班后重启收银程序 //Global.Instance.Restart = true; //Application.ExitThread(); while (splitPayFinished || DateTime.Now.Minute > shiftDateTime.AddMinutes(20).Minute) { if (splitPayFinished) { LOGGER.Info("交接班分账,splitPayFinished=true"); } else if (DateTime.Now.Minute > shiftDateTime.AddMinutes(20).Minute) { LOGGER.Info("交接班分账,超出规定分账时长<20>分钟"); } splitPayFinished = false; shiftDateTime = shiftDateTime.AddMinutes(100); //刷新界面??? //交班打印 this.ShowToastNotify(this, "开始打印"); //构建收银小票模版参数 handOverTicket.PrintType = ""; handOverTicket.handMoney = handsMoney;//手工金额 handOverTicket.diffMoney = difMoney;//差异金额 bool ShiftPrint = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_SHIFPRINT, false); LOGGER.Info("-------------------构建小票参数------------------------------"); LOGGER.Info(JsonUtils.Serialize(this.handOverTicket)); var vars = ShiftHelper.BuilderTicketVariable(handOverTicket, ShiftPrint, false); LOGGER.Info("-------------------------------------------------"); //交班开钱箱 bool openCashbox = false; if (Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_ISSHIFTOPENCASH)) { openCashbox = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_ISSHIFTOPENCASH); } Tuple result = ShiftHelper.PrinterTicket("交班汇总", vars, true, openCashbox); this.ShowToastNotify(this, string.Format("{0}", result.Item2)); //是否交班 Global.isHandOver = false; StoreBusinessUtils.SaveOperationLog("103", "班次:" + handOverTicket.ShiftNo); //关闭当前秤 MsgEvent.Send(Constant.CURRENTSTEELYARD_STATUS_CHANGE, "close"); //两秒退出系统 System.Threading.Thread.Sleep(2000); OnCloseTouchClick(sender, e); //交班后重启收银程序 Global.Instance.Restart = true; Application.ExitThread(); } } } catch (Exception ex) { LOGGER.Error(ex, "确认交班发生异常"); } finally { button.Enabled = true; } #endregion } private void OnControlBoxKeyboardClick(object sender, EventArgs e) { try { KeyboardType keyboardType = KeyboardType.中文; Type type = this.ActiveControl.GetType(); PropertyInfo pinfo = type.GetProperty("Keyboard"); if (pinfo != null) { keyboardType = (KeyboardType)pinfo.GetValue(this.ActiveControl, null); } var keyboard = Application.OpenForms["VirtualKeyboard"]; if (keyboard == null) { keyboard = new VirtualKeyboard(keyboardType); } ((VirtualKeyboard)keyboard).ShowVirtualKeyboard(this, keyboardType); } catch (Exception ex) { LOGGER.Error(ex, "打开屏幕键盘异常"); } } #region subin 20231025 分账由实时改为交班时分账 delegate void EventJisuan(object sender, EventArgs e); SplitPayUploadForm splitFrm; protected virtual void MessageEventNotify(object sender, MsgEventArgs args) { int pos = Convert.ToInt32(args.Data); splitFrm.setPos(pos);//设置进度条位置20% } private void SplitHandle(object sender, EventArgs e) { var sDate = DateTime.Now.ToString("yyyy-MM-dd 00:00:00"); var eDate = DateTime.Now.AddDays(1).ToString("yyyy-MM-dd 00:00:00"); var count = 0; using (var db = Global.Instance.OpenDataBase) { count = db.Query($"where isSplited = 0 and finishDate between '{sDate}' and '{eDate}';").Count(); } splitFrm.ProgressBar1.Maximum = count * 2 * 3; splitFrm.Show(this); splitFrm.setPos(0);//设置进度条位置0% //需要加载进度的内容 var isException = SplitPayUtils.Instance.Order2Split(DateTime.Now); if (isException) { LOGGER.Info($"↓↓↓日订单[{DateTime.Now.ToString("yyyy-MM-dd")}]转分账数据失败↓↓↓"); //DialogForm dialog = new DialogForm("提示信息", $"日订单[{DateTime.Now.ToString("yyyy-MM-dd")}]数据处理失败"); //dialog.Show(); } //splitFrm.setPos(200);//设置进度条位置0% splitFrm.setPos(count * 2);//设置进度条位置0% #region 上传分账记录 var result1 = SplitPayUtils.Instance.SplitData2Server(DateTime.Now, count * 2); if (result1.Item1) { LOGGER.Info($"↓↓↓日订单[{DateTime.Now.ToString("yyyy-MM-dd")}]分账数据上传完成完成↓↓↓"); } else { LOGGER.Info($"↓↓↓日订单[{DateTime.Now.ToString("yyyy-MM-dd")}]分账数据上传完成失败↓↓↓"); //DialogForm dialog = new DialogForm("提示信息", $"日订单[{DateTime.Now.ToString("yyyy-MM-dd")}]数据上传失败"); //dialog.Show(); } //splitFrm.setPos(1000);//设置进度条位置0% splitFrm.setPos(count * 2 + count * 3);//设置进度条位置0% Thread.Sleep(100); splitFrm.Close(); MsgEvent.Send(Constant.SPLITPAY_UPLOAD_FINISHED, true); #endregion } protected virtual void SplitPayFinishEventNotify(object sender, MsgEventArgs args) { splitPayFinished = true; LOGGER.Info("交接班分账完成"); } #endregion } }