using POSV.Entity; using POSV.HandOver; using POSV.Helper; using POSV.MessageEvent; using POSV.ShoppingCart; using POSV.Utils; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Windows.Forms; namespace POSV.Shift { public partial class FastShitBlindForm : BusinessForm { HandOverTicket handOverTicket = null; //总长度 private const int _totalLength = 25; //左列长度 private const int _leftLength = 10; //右列长度 private const int _rightLength = _totalLength - _leftLength; //默认左边距 private const int _defaultPadLeft = 2; public FastShitBlindForm() { InitializeComponent(); LOGGER.Info("打开交班界面"); } protected override void OnLoad(EventArgs e) { base.OnLoad(e); if (this.DesignMode) return; Task.Factory.StartNew(() => { 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; }).ContinueWith(task => { this.Invoke(new Action(() => { //组装界面数据 workerNoLable.Text = handOverTicket.WorkNo; workerNameLable.Text = handOverTicket.WorkName; label_startTime.Text = handOverTicket.DatetimeBegin; label_endTime.Text = handOverTicket.DatetimeEnd; BuildContent(); })); }); } private void BuildContent() { var plan = Global.Instance.BusinessPlanLog; //主单信息 StringBuilder bs = new StringBuilder(); bs.AppendLine(BuildTwoCText(string.Format("总人数:"), _leftLength, string.Format("{0}人", handOverTicket.PeopleCount), _rightLength)); bs.AppendLine(BuildTwoCText(string.Format("合计单数:"), _leftLength, string.Format("{0}单", handOverTicket.TicketCount), _rightLength)); bs.AppendLine(BuildTwoCText(string.Format("合计金额:"), _leftLength, string.Format("{0}元", handOverTicket.Amount), _rightLength)); bs.AppendLine(BuildTwoCText(string.Format("成交单数:"), _leftLength, string.Format("{0}单", handOverTicket.DealTicketCount), _rightLength)); bs.AppendLine(BuildTwoCText(string.Format("成交金额:"), _leftLength, string.Format("{0}元", handOverTicket.DealAmount), _rightLength)); bs.AppendLine(BuildTwoCText(string.Format("退款单数:"), _leftLength, string.Format("{0}单", handOverTicket.BackTicketCount), _rightLength)); bs.AppendLine(BuildTwoCText(string.Format("退款金额:"), _leftLength, string.Format("{0}元", handOverTicket.BackAmount), _rightLength)); bs.AppendLine(BuildTwoCText(string.Format("销售优惠:"), _leftLength, string.Format("{0}元", handOverTicket.DiscountMoney), _rightLength)); bs.AppendLine(BuildTwoCText(string.Format("销售应收:"), _leftLength, string.Format("{0}元", handOverTicket.Receivable), _rightLength)); bs.AppendLine(BuildTwoCText(string.Format("抹零金额:"), _leftLength, string.Format("{0}元", handOverTicket.Maling), _rightLength)); bs.AppendLine("-------------------------"); bs.AppendLine(BuildTwoCText(string.Format("实收金额:"), _leftLength, string.Format("{0}元", handOverTicket.Paid), _rightLength)); this.richTextBoxEx1.Text = bs.ToString(); List payList = handOverTicket.Detail; //支付信息 bs = new StringBuilder(); foreach (var typeData in payList) { bs.AppendLine(BuildTwoCText(string.Format("{0}:", typeData.PayModeName), _leftLength, string.Format("{0}元", typeData.Money), _rightLength)); } bs.AppendLine("-------------------------"); bs.AppendLine(BuildTwoCText(string.Format("合计:"), _leftLength, string.Format("{0}元", handOverTicket.Paid), _rightLength)); this.richTextBoxEx2.Text = bs.ToString(); //卡务信息 bs = new StringBuilder(); foreach (var typeData in payList) { bs.AppendLine(BuildTwoCText(string.Format("{0}:", typeData.PayModeName), _leftLength, string.Format("{0}元", typeData.CardMoney), _rightLength)); } bs.AppendLine("-------------------------"); bs.AppendLine(BuildTwoCText(string.Format("充值笔数:"), _leftLength, string.Format("{0}笔", handOverTicket.CardCount), _rightLength)); bs.AppendLine(BuildTwoCText(string.Format("充值金额:"), _leftLength, string.Format("{0}元", handOverTicket.CardRealMoney), _rightLength)); bs.AppendLine("-------------------------"); bs.AppendLine(BuildTwoCText(string.Format("退卡笔数:"), _leftLength, string.Format("{0}笔", handOverTicket.CardRefundCount), _rightLength)); bs.AppendLine(BuildTwoCText(string.Format("退卡金额:"), _leftLength, string.Format("{0}元", handOverTicket.CardRefundMoney), _rightLength)); this.richTextBoxEx3.Text = bs.ToString(); } private string BuildOneRText(string text, int paddingLeft) { return text + "".PadLeft(paddingLeft, ' '); } private string BuildTwoCText(string leftStr, int leftLength, string rightStr, int rightLength) { StringBuilder result = new StringBuilder(); leftStr = leftStr ?? ""; rightStr = rightStr ?? ""; var tempLeftStr = leftStr; var tempRightStr = rightStr; //左侧字符真实长度 var leftStrLen = GetPrintStringLength(tempLeftStr); bool leftNewLine = false; if (leftStrLen > leftLength) { //左侧已经超出,独占一行 leftNewLine = true; } else { //填充空格 var leftDiff = leftLength - leftStrLen; tempLeftStr = "".PadLeft(leftDiff, ' ') + tempLeftStr; } //右侧字符真实长度 var rightStrLen = GetPrintStringLength(tempRightStr); if (rightStrLen > rightLength) { //右侧已超出,独占一行 var totalLength = leftLength + rightLength; if (rightStrLen > totalLength) { //从头开始 } else { //填充空格 var rightDiff = totalLength - rightStrLen; tempRightStr = "".PadLeft(rightDiff, ' ') + tempRightStr; } } else { //填充空格 var rightDiff = rightLength - rightStrLen; tempRightStr = "".PadLeft(rightDiff, ' ') + tempRightStr; } result.Append(tempLeftStr); if (leftNewLine) { result.Append(Environment.NewLine); } result.Append(tempRightStr); return result.ToString(); } private static int GetPrintStringLength(string str) { int valueLength = 0; string chinese = @"^[\u0391-\uFFE5]+$"; // 获取字段值的长度,如果含中文字符,则每个中文字符长度为2,否则为1 for (int i = 0; i < str.Length; i++) { // 获取一个字符 string temp = str[i].ToString(); // 判断是否为中文字符 if (Regex.IsMatch(temp, chinese)) { valueLength += 2; } else { valueLength += 1; } } // 进位取整 return valueLength; } /// /// 查询未交单外送单数量 /// /// 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 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; } 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(); // 第一步销售收入 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 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 "); string sql = string.Format(sqlBuf.ToString(), Global.Instance.BusinessPlanLog.WorkerNo, Global.Instance.BusinessPlanLog.No, Global.Instance.BusinessPlanLog.StoreId); List list = db.Query(sql).ToList(); int i = 0; foreach (HandOverDetail handOverDetail in list) { handOverDetail.Index = i + 1; i = i + 1; payTypeMap.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 list) { 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); } } } 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) { 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 = string.Format("员工:{0},{1}交班单", handOverTicket.WorkName, handOverTicket.ShiftNo); 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; //交班打印 this.ShowToastNotify(this, "开始打印"); //构建收银小票模版参数 handOverTicket.PrintType = ""; handOverTicket.handMoney = handsMoney;//手工金额 handOverTicket.diffMoney = difMoney;//差异金额 bool ShiftPrint = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_SHIFPRINT, false); var vars = ShiftHelper.BuilderTicketVariable(handOverTicket, ShiftPrint, false); Tuple result = ShiftHelper.PrinterTicket("食堂版交班汇总_通用模版", vars, true, false); this.ShowToastNotify(this, string.Format("{0}", result.Item2)); //是否交班 Global.isHandOver = false; //关闭当前秤 MsgEvent.Send(Constant.CURRENTSTEELYARD_STATUS_CHANGE, "close"); //两秒退出系统 System.Threading.Thread.Sleep(2000); OnCloseTouchClick(sender, e); //交班后重启收银程序 Global.Instance.Restart = true; Application.ExitThread(); } } } }