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#

9 months ago
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;
9 months ago
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);
9 months ago
#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 原始代码
9 months ago
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;
9 months ago
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);
9 months ago
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)
9 months ago
{
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();
9 months ago
}
}
}
catch (Exception ex)
{
LOGGER.Error(ex, "确认交班发生异常");
}
finally
{
button.Enabled = true;
}
#endregion
9 months ago
}
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;
9 months ago
splitFrm.Show(this);
splitFrm.setPos(0);//设置进度条位置0%
//需要加载进度的内容
var isException = SplitPayUtils.Instance.Order2Split(DateTime.Now);
if (isException)
{
9 months ago
LOGGER.Info($"↓↓↓日订单[{DateTime.Now.ToString("yyyy-MM-dd")}]转分账数据失败↓↓↓");
//DialogForm dialog = new DialogForm("提示信息", $"日订单[{DateTime.Now.ToString("yyyy-MM-dd")}]数据处理失败");
//dialog.Show();
9 months ago
}
//splitFrm.setPos(200);//设置进度条位置0%
splitFrm.setPos(count * 2);//设置进度条位置0%
9 months ago
#region 上传分账记录
var result1 = SplitPayUtils.Instance.SplitData2Server(DateTime.Now, count * 2);
9 months ago
if (result1.Item1)
{
LOGGER.Info($"↓↓↓日订单[{DateTime.Now.ToString("yyyy-MM-dd")}]分账数据上传完成完成↓↓↓");
}
else
{
9 months ago
LOGGER.Info($"↓↓↓日订单[{DateTime.Now.ToString("yyyy-MM-dd")}]分账数据上传完成失败↓↓↓");
//DialogForm dialog = new DialogForm("提示信息", $"日订单[{DateTime.Now.ToString("yyyy-MM-dd")}]数据上传失败");
//dialog.Show();
9 months ago
}
//splitFrm.setPos(1000);//设置进度条位置0%
splitFrm.setPos(count * 2 + count * 3);//设置进度条位置0%
9 months ago
Thread.Sleep(100);
splitFrm.Close();
MsgEvent.Send(Constant.SPLITPAY_UPLOAD_FINISHED, true);
9 months ago
#endregion
}
9 months ago
protected virtual void SplitPayFinishEventNotify(object sender, MsgEventArgs args)
{
splitPayFinished = true;
LOGGER.Info("交接班分账完成");
9 months ago
}
#endregion
}
}