public int CreateCommissionLog(CommissionLog log) { DataCommand command = DataCommandManager.GetDataCommand("CreateCommissionLog"); command.CommandTimeout = 120; command.SetParameterValue("@CommissionItemSysNo", log.CommissionItemSysNo); command.SetParameterValue("@ReferenceSysNo", log.ReferenceSysNo); command.SetParameterValue("@ReferenceType", log.ReferenceType); if (log.PromotionDiscount == 0) { command.SetParameterValue("@PromotionDiscount", DBNull.Value); } else { command.SetParameterValue("@PromotionDiscount", log.PromotionDiscount); } if (log.ProductSysNo == 0) { command.SetParameterValue("@ProductSysNo", DBNull.Value); } else { command.SetParameterValue("@ProductSysNo", log.ProductSysNo); } if (log.Price == 0) { command.SetParameterValue("@Price", DBNull.Value); } else { command.SetParameterValue("@Price", log.Price); } if (log.Qty == 0) { command.SetParameterValue("@Qty", DBNull.Value); } else { command.SetParameterValue("@Qty", log.Qty); } command.SetParameterValue("@Type", log.Type); command.SetParameterValue("@InUser", log.InUser); command.SetParameterValue("@EditUser", log.EditUser); command.SetParameterValue("@CompanyCode", GlobalSettings.CompanyCode); command.SetParameterValue("@StoreCompanyCode", GlobalSettings.StoreCompanyCode); command.SetParameterValue("@LanguageCode", GlobalSettings.LanguageCode); command.SetParameterValue("@CurrencyCode", GlobalSettings.CurrencyCode); return(command.ExecuteNonQuery()); }
public Int32 UpdateCommissionLog(CommissionLog log) { DataCommand command = DataCommandManager.GetDataCommand("UpdateCommissionLog"); command.SetParameterValue("@SysNo", log.SysNo); command.SetParameterValue("@CommissionItemSysNo", log.CommissionItemSysNo); command.SetParameterValue("@Type", log.Type); command.SetParameterValue("@ReferenceSysNo", log.ReferenceSysNo); command.SetParameterValue("@ReferenceType", log.ReferenceType); if (log.PromotionDiscount == 0) { command.SetParameterValue("@PromotionDiscount", DBNull.Value); } else { command.SetParameterValue("@PromotionDiscount", log.PromotionDiscount); } if (log.ProductSysNo == 0) { command.SetParameterValue("@ProductSysNo", DBNull.Value); } else { command.SetParameterValue("@ProductSysNo", log.ProductSysNo); } if (log.Price == 0) { command.SetParameterValue("@Price", DBNull.Value); } else { command.SetParameterValue("@Price", log.Price); } if (log.Qty == 0) { command.SetParameterValue("@Qty", DBNull.Value); } else { command.SetParameterValue("@Qty", log.Qty); } command.SetParameterValue("@EditUser", log.EditUser); return(command.ExecuteNonQuery()); }
private void SetOrderCommissionForRMA(CommissionRule rule, CommissionLog item) { var orderCommission = dal.GetOrderCommissionLog(item.SoSysNo); if (orderCommission == null) { item.CommissionAmt = -rule.OrderCommissionFee; } else { item.CommissionItemSysNo = orderCommission.CommissionItemSysNo; item.CommissionAmt = -orderCommission.Price; } item.Price = item.CommissionAmt; }
private void ComputeCommissionForVendor(IGrouping <int, CommissionLog> vendor) { CommissionMaster master; try { if (vendor.Key == 0) { throw new Exception(string.Format("错误数据,VendorSysNo为0,ProductSysNo:{0}", String.Join(",", vendor.Select(x => x.ProductSysNo.ToString()).ToArray()))); } using (TransactionScope scope = new TransactionScope()) { #region 计算供应商的佣金 master = dal.GetCommissionMasterByMerchantSysNo(vendor.Key); bool isOnlyCalcRentFee = IsOnlyCalculateRentFee(master); //计算店租佣金 //<-增加手动结算的修复处理 2012-4-24 //SetCommissionTimeInfo(master); SetCommissionTimeInfo(master, this.now); //-> SetTotalRent(master); if (!isOnlyCalcRentFee) { var itemsForComputing = new List <CommissionItem>(); var logsForVendor = new List <CommissionLog>(); var agentGroup = from i in vendor group i by i.VendorManufacturerSysNo into g select g; foreach (var agent in agentGroup) { var item = dal.GetCommissionItemByVMSysNo(agent.Key, master.SysNo); itemsForComputing.Add(item); var logsForItem = new List <CommissionLog>(); CommissionRule rule = null; foreach (var itemWithSameAgent in agent) { #region 计算代理信息的佣金 if (rules.ContainsKey(itemWithSameAgent.VendorManufacturerSysNo)) { rule = rules[itemWithSameAgent.VendorManufacturerSysNo]; if (itemWithSameAgent.ReferenceSysNo > 0) { if (itemWithSameAgent.SysNo.HasValue) { #region 更新log switch (itemWithSameAgent.Type) { case Constants.CommissionLogType.OrderCommission: if (itemWithSameAgent.ReferenceType == Constants.OrderType.SO) { itemWithSameAgent.CommissionAmt = rule.OrderCommissionFee; itemWithSameAgent.Price = rule.OrderCommissionFee; } else if (itemWithSameAgent.HaveAutoRMA == 1) { itemWithSameAgent.CommissionAmt = -rule.OrderCommissionFee; itemWithSameAgent.Price = -rule.OrderCommissionFee; //SetOrderCommissionForRMA(rule, itemWithSameAgent); } break; case Constants.CommissionLogType.SaleCommission: if (itemWithSameAgent.ReferenceType == Constants.OrderType.SO) { var salesPrice = itemWithSameAgent.Price - itemWithSameAgent.Point / 10m - itemWithSameAgent.DiscountAmt / itemWithSameAgent.Qty; itemWithSameAgent.Price = salesPrice; decimal?promotiondiscount = itemWithSameAgent.PromotionDiscount.HasValue ? itemWithSameAgent.PromotionDiscount : 0; //优惠券折扣 itemWithSameAgent.CommissionAmt = Math.Round((itemWithSameAgent.Price * itemWithSameAgent.Qty) + promotiondiscount.Value, 2); } else { var salesPrice = itemWithSameAgent.Price - itemWithSameAgent.Point / 10m - itemWithSameAgent.DiscountAmt; itemWithSameAgent.Price = salesPrice; itemWithSameAgent.CommissionAmt = Math.Round(itemWithSameAgent.Price * itemWithSameAgent.Qty, 2); } break; case Constants.CommissionLogType.DeliveryFee: itemWithSameAgent.CommissionAmt = rule.DeliveryFee; itemWithSameAgent.Price = rule.DeliveryFee; break; default: break; } dal.UpdateCommissionLog(itemWithSameAgent); logsForItem.Add(itemWithSameAgent); logsForVendor.Add(itemWithSameAgent); #endregion } else { #region 新增LOG if (itemWithSameAgent.ReferenceType == Constants.OrderType.SO) { #region SO //计算实际出售价格 var salesPrice = itemWithSameAgent.Price - itemWithSameAgent.Point / 10m - itemWithSameAgent.DiscountAmt / itemWithSameAgent.Qty; itemWithSameAgent.Price = salesPrice; //优惠券折扣 decimal?promotiondiscount = itemWithSameAgent.PromotionDiscount.HasValue ? itemWithSameAgent.PromotionDiscount : 0; //新建log CommissionLog orderCommission = new CommissionLog { CommissionItemSysNo = item.SysNo, ReferenceSysNo = itemWithSameAgent.ReferenceSysNo, ReferenceType = itemWithSameAgent.ReferenceType, ProductSysNo = itemWithSameAgent.ProductSysNo, Price = rule.OrderCommissionFee, InUser = GlobalSettings.UserName, EditUser = GlobalSettings.UserName, Type = Constants.CommissionLogType.OrderCommission, CommissionAmt = rule.OrderCommissionFee }; logsForItem.Add(orderCommission); logsForVendor.Add(orderCommission); //新建log CommissionLog deliveryFee = new CommissionLog { CommissionItemSysNo = item.SysNo, ReferenceSysNo = itemWithSameAgent.ReferenceSysNo, ReferenceType = itemWithSameAgent.ReferenceType, ProductSysNo = itemWithSameAgent.ProductSysNo, Price = rule.DeliveryFee, InUser = GlobalSettings.UserName, EditUser = GlobalSettings.UserName, Type = Constants.CommissionLogType.DeliveryFee, CommissionAmt = rule.DeliveryFee }; logsForItem.Add(deliveryFee); logsForVendor.Add(deliveryFee); //新建log CommissionLog salesCommission = new CommissionLog { CommissionItemSysNo = item.SysNo, ReferenceSysNo = itemWithSameAgent.ReferenceSysNo, ReferenceType = itemWithSameAgent.ReferenceType, ProductSysNo = itemWithSameAgent.ProductSysNo, Price = itemWithSameAgent.Price, Qty = itemWithSameAgent.Qty, InUser = GlobalSettings.UserName, EditUser = GlobalSettings.UserName, Type = Constants.CommissionLogType.SaleCommission, CommissionAmt = Math.Round((itemWithSameAgent.Price * itemWithSameAgent.Qty) + promotiondiscount.Value, 2) , PromotionDiscount = promotiondiscount.Value }; dal.CreateCommissionLog(salesCommission); logsForItem.Add(salesCommission); logsForVendor.Add(salesCommission); #endregion } else { #region RMA var salesPrice = itemWithSameAgent.Price - itemWithSameAgent.Point / 10m - itemWithSameAgent.DiscountAmt; itemWithSameAgent.Price = salesPrice; //物流拒收需要退回订单提成 if (itemWithSameAgent.HaveAutoRMA == 1) { //新建log CommissionLog orderCommission = new CommissionLog { CommissionItemSysNo = item.SysNo, ReferenceSysNo = itemWithSameAgent.ReferenceSysNo, ReferenceType = itemWithSameAgent.ReferenceType, ProductSysNo = itemWithSameAgent.ProductSysNo, Price = -rule.OrderCommissionFee, InUser = GlobalSettings.UserName, EditUser = GlobalSettings.UserName, Type = Constants.CommissionLogType.OrderCommission, CommissionAmt = -rule.OrderCommissionFee }; logsForItem.Add(orderCommission); logsForVendor.Add(orderCommission); } //新建log CommissionLog salesCommission = new CommissionLog { CommissionItemSysNo = item.SysNo, ReferenceSysNo = itemWithSameAgent.ReferenceSysNo, ReferenceType = itemWithSameAgent.ReferenceType, ProductSysNo = itemWithSameAgent.ProductSysNo, Price = itemWithSameAgent.Price, Qty = itemWithSameAgent.Qty, InUser = GlobalSettings.UserName, EditUser = GlobalSettings.UserName, Type = Constants.CommissionLogType.SaleCommission, CommissionAmt = Math.Round(itemWithSameAgent.Price * itemWithSameAgent.Qty, 2) }; dal.CreateCommissionLog(salesCommission); logsForItem.Add(salesCommission); logsForVendor.Add(salesCommission); #endregion } #endregion } } //记录使用的佣金规则编号 item.RuleSysNo = rule.SysNo; } #endregion } if (rule != null) { item.TotalSaleAmt = Math.Round(logsForItem .Where(x => { return(x.Type == Constants.CommissionLogType.SaleCommission); }) .Sum(x => x.CommissionAmt), 2); if (rule.SalesRule == null) { break; } var salesRule = rule.SalesRule.ToObject <SalesRuleEntity>(); item.Rent = rule.RentFee * master.Percentage; if (salesRule != null) { item.SalesCommissionFee = Math.Max(GetSaleCommissionAmount(item.TotalSaleAmt, salesRule), salesRule.MinCommissionAmt); } item.EditUser = GlobalSettings.UserName; } } #region 计算订单提成 var queryOrderCommission = from i in logsForVendor where i.Type == Constants.CommissionLogType.OrderCommission group i by new { i.ReferenceSysNo, i.ReferenceType } into g select g; List <CommissionLog> orderFee = new List <CommissionLog>(); foreach (var orderCommission in queryOrderCommission) { if (orderCommission.Key.ReferenceType == Constants.OrderType.SO) { var soList = from i in orderCommission where i.ReferenceType == Constants.OrderType.SO orderby i.CommissionAmt descending select i; orderFee.Add(soList.First()); } } foreach (var orderCommission in queryOrderCommission) { if (orderCommission.Key.ReferenceType == Constants.OrderType.RMA) { var rmaList = from i in orderCommission where i.ReferenceType == Constants.OrderType.RMA orderby i.CommissionAmt select i; var rma = rmaList.First(); var so1 = dal.GetOrderCommissionLog(rma.SoSysNo); var so2 = orderFee.Where(so => so.Type == Constants.OrderType.SO && so.ReferenceSysNo == rma.SoSysNo).OrderByDescending(so => so.Price).FirstOrDefault(); if (so2 != null) { rma.CommissionItemSysNo = so2.CommissionItemSysNo; rma.Price = -so2.Price; } else if (so1 != null) { rma.CommissionItemSysNo = so1.CommissionItemSysNo; rma.Price = -so1.Price; } orderFee.Add(rma); } } #endregion #region 计算配送费 var queryDeliveryFee = from i in logsForVendor where i.Type == Constants.CommissionLogType.DeliveryFee group i by new { i.ReferenceSysNo, i.ReferenceType } into g select g; List <CommissionLog> delivery = new List <CommissionLog>(); foreach (var deliveryCommission in queryDeliveryFee) { var soList = from i in deliveryCommission orderby i.CommissionAmt descending select i; var so = soList.FirstOrDefault(); if (so != null) { delivery.Add(so); } } #endregion #region 更新SOC DEF LOG foreach (var item in itemsForComputing) { var ordersBelongToItem = from log in orderFee where log.CommissionItemSysNo == item.SysNo select log; item.OrderCommissionFee = ordersBelongToItem.Sum(x => x.CommissionAmt); dal.DeleteCommissionLog(item.SysNo, Constants.CommissionLogType.OrderCommission); foreach (var log in ordersBelongToItem) { dal.CreateCommissionLog(log); } var deliverysBelongToItem = from log in delivery where log.CommissionItemSysNo == item.SysNo select log; dal.DeleteCommissionLog(item.SysNo, Constants.CommissionLogType.DeliveryFee); foreach (var log in deliverysBelongToItem) { dal.CreateCommissionLog(log); } item.DeliveryFee = deliverysBelongToItem.Sum(x => x.CommissionAmt); dal.UpdateCommissionItem(item); } #endregion master.OrderCommissionFee = itemsForComputing.Sum(x => x.OrderCommissionFee); master.DeliveryFee = itemsForComputing.Sum(x => x.DeliveryFee); master.SalesCommissionFee = itemsForComputing.Sum(x => x.SalesCommissionFee); } master.TotalAmt = master.DeliveryFee + master.OrderCommissionFee + master.RentFee + master.SalesCommissionFee; dal.UpdateCommissionMaster(master); scope.Complete(); #endregion } if (merchants.Select(x => x.SysNo).Contains(master.MerchantSysNo)) { SettleCommission(master); } } catch (Exception ex) { var message = ex.Message + Environment.NewLine + ex.StackTrace; OnDisplayMessage(message); SendMail(GlobalSettings.MailSubject, message); } }