You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1453 lines
75 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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<HandOverDetail> detail = getHandOverDetail();
foreach (HandOverDetail handOverDetail in detail)
{
handOverDetail.HandsMoney = handOverDetail.SumMoney;
}
handOverTicket.Detail = detail;
//汇总菜品类别销售
List<HandOverProduct> ProductList = loadHandOverProduct();
handOverTicket.Product = ProductList;
//汇总班次优惠金额
List<HandOverInfo> InfoList = loadHandOverInfo();
handOverTicket.Info = InfoList;
//汇总班次支付方式明细
List<HandOverPay> payList = loadHandOverPay();
handOverTicket.Pay = payList;
//汇总班次菜品分类
List<HandOverProductType> productTypeList = loadHandOverProductType();
handOverTicket.ProductType = productTypeList;
//汇总班次营业模式数据
List<HandOverSaleMode> 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();
}
}
}
/// <summary>
/// 查询未交单外送单数量
/// </summary>
/// <returns></returns>
private int GetWsUnFinishOrder()
{
int result = 0;
try
{
List<OrderDelivery> deliveryList = null;
using (var db = Global.Instance.OpenDataBase)
{
deliveryList = db.Fetch<OrderDelivery>(@"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<BusinessPlanLog> businessPlanLogList = db.Query<BusinessPlanLog>(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<HandOverPay> loadHandOverPay()
{
List<HandOverPay> list = new List<HandOverPay>();
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<HandOverPay> handOverPayList = db.Query<HandOverPay>(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<HandOverPay> handOverRechargePayList = db.Query<HandOverPay>(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<HandOverPay> handOverSalePayList = db.Query<HandOverPay>(sql).ToList();
foreach (HandOverPay handOverPay in handOverSalePayList)
{
handOverPay.BusMode = -1;
handOverPay.BusType = 1;//充值
list.Add(handOverPay);
}
}
}
catch (Exception ex)
{
LOGGER.Error(ex);
}
return list;
}
/// <summary>
/// 销售分析
/// zhangy 2019-12-11 Add
/// 重写的方法
/// </summary>
/// <returns></returns>
public List<HandOverProduct> loadHandOverProduct()
{
List<HandOverProduct> list = new List<HandOverProduct>();
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<HandOverProduct> handOverProductList = new List<HandOverProduct>();
using (var db = Global.Instance.OpenDataBase)
{
handOverProductList = db.Query<HandOverProduct>(sql).ToList();
}
decimal sumCount = 0.00M;
decimal sumSuitQuantity = 0.00M;
decimal sumAmount = 0.00M;
List<Dictionary<string, object>> result = new List<Dictionary<string, object>>();
handOverProductList = handOverProductList.OrderBy(x => x.TypeId).ToList();
///分类集合
var typeMap = handOverProductList.GroupBy(g => new { g.TypeId }).Select(group =>
{
var map = new Dictionary<string, object>();
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<string, object>();
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<string, Object>();
seriesMap.Add("type", 1);
seriesMap.Add("name", "小计");
seriesMap.Add("count", count);
seriesMap.Add("suitQuantity", suitQuantity);
seriesMap.Add("amount", amount);
result.Add(seriesMap);
}
Dictionary<string, Object> sumMap = new Dictionary<string, Object>();
sumMap.Add("name", "销售");
sumMap.Add("type", 2);
sumMap.Add("count", sumCount);
sumMap.Add("suitQuantity", sumSuitQuantity);
sumMap.Add("amount", sumAmount);
result.Add(sumMap);
foreach (Dictionary<string, Object> 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<HandOverProduct> loadHandOverProduct()
//{
// List<HandOverProduct> handOverProductList = null;
// List<HandOverProduct> 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<HandOverProduct>(sql).ToList();
// string seriesId = "";
// string seriesName = "";
// Dictionary<string, Object> seriesMap = new Dictionary<string, Object>();
// Dictionary<string, Object> typeMap = new Dictionary<string, Object>();
// 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<Dictionary<string, Object>> result = new List<Dictionary<string, Object>>();
// 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<string, Object>();
// }
// seriesMap = new Dictionary<string, Object>();
// 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<string, Object> dishMap = new Dictionary<string, Object>();
// 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<string, Object>();
// }
// }
// Dictionary<string, Object> sumMap = new Dictionary<string, Object>();
// 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<HandOverProduct>();
// foreach (Dictionary<string, Object> 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;
//}
/// <summary>
/// 汇总各营业模式的次数和金额
/// </summary>
/// <returns></returns>
public List<HandOverSaleMode> loadHandOverSaleMode()
{
List<HandOverSaleMode> 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<HandOverSaleMode>(sql).ToList();
}
}
catch (Exception ex)
{
LOGGER.Error(ex);
}
return list;
}
/// <summary>
/// 获取交班优惠
/// </summary>
/// <returns></returns>
public List<HandOverInfo> loadHandOverInfo()
{
List<HandOverInfo> 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<HandOverInfo>(sql).ToList();
}
}
catch (Exception ex)
{
LOGGER.Error(ex);
}
return list;
}
//汇总销售分类
public List<HandOverProductType> loadHandOverProductType()
{
List<HandOverProductType> 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<HandOverProductType>(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<HandOverTicket>(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<HandOverTicket>(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<HandOverTicket>(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<HandOverTicket>(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<HandOverTicket>(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<HandOverTicket>(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<HandOverTicket>(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<HandOverTicket>(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<HandOverTicket>(sql);
if (wxWaimaiOrder == null)
{
handOverTicket.DistributionFee = 0.00M;
}
else
{
handOverTicket.DistributionFee = wxWaimaiOrder.DistributionFee;
}
}
}
catch (Exception ex)
{
LOGGER.Error(ex);
}
return handOverTicket;
}
public List<HandOverDetail> getHandOverDetail()
{
List<HandOverDetail> sumList = new List<HandOverDetail>();
try
{
using (var db = Global.Instance.OpenDataBase)
{
Dictionary<string, string> payTypeMap = new Dictionary<string, string>();
Dictionary<string, string> onlinePayTypeMap = new Dictionary<string, string>();
// 第一步销售收入
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<HandOverDetail> list = db.Query<HandOverDetail>(sql).ToList();
if (list == null)
{
list = new List<HandOverDetail>();
}
var offlineList = list.FindAll(x => (x.BusMode != 4 && x.BusMode != 5 && x.BusMode != 7));
if (offlineList == null)
{
offlineList = new List<HandOverDetail>();
}
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<HandOverDetail>();
}
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<HandOverDetail> listDetail = db.Query<HandOverDetail>(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<HandOverDetail> listSaleDetail = db.Query<HandOverDetail>(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<HandOverDetail> listRefundDetail = db.Query<HandOverDetail>(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<string, string> 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<string, string> 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<HandOverTicket>(entity);
// 保存支付汇总
List<HandOverDetail> detail = entity.Detail;
if (detail != null && detail.Count > 0)
{
foreach (HandOverDetail detailEntity in detail)
{
db.Save<HandOverDetail>(detailEntity);
}
}
// 保存盘点数据 (茶饮上专用,暂时不做)
// 保存交班支付方式明细
List<HandOverPay> pay = entity.Pay;
if (pay != null && pay.Count > 0)
{
foreach (HandOverPay handOverPay in pay)
{
db.Save<HandOverPay>(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<UploadHandoverObject>(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<SaomaPayTicket>(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<bool, string> 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<bool, string> 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<OrderObject>($"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
}
}