Exemplo n.º 1
0
        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());
        }
Exemplo n.º 2
0
        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());
        }
Exemplo n.º 3
0
        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;
        }
Exemplo n.º 4
0
        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);
            }
        }