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.00 M ;
decimal sumSuitQuantity = 0.00 M ;
decimal sumAmount = 0.00 M ;
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.00 M ;
decimal suitQuantity = 0.00 M ;
decimal amount = 0.00 M ;
//查询指定分类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.00 M ;
handOverTicket . DealTicketCount = 0 ;
handOverTicket . DealAmount = 0.00 M ;
handOverTicket . BackTicketCount = 0 ;
handOverTicket . BackAmount = 0.00 M ;
handOverTicket . DiscountMoney = 0.00 M ;
handOverTicket . Receivable = 0.00 M ;
handOverTicket . Maling = 0.00 M ;
}
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.00 M ;
}
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.00 M ;
handOverTicket . Outmoney = 0.00 M ;
}
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.00 M ;
}
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.00 M ;
handOverTicket . VirtualMoney = 0.00 M ;
}
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.00 M ;
}
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.00 M ;
detailEntity . CardCount = 0 ;
detailEntity . CardMoney = 0.00 M ;
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.00 M ;
decimal difMoney = 0.00 M ;
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.00 M ;
}
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
}
}