private void Sava()
 {
     Model.AccountInfo account = new Model.AccountInfo(this.AddTime, this.Money, this.Remark);
     //MainViewModel.Moneys.Add(account);
     this.CloseCommand.Execute(null);
 }
Esempio n. 2
0
        private void CalculationMoney(DateTime startDate, DateTime endDate)
        {
            Entity.Entities entity = new Entities();
            //退货单的详细
            var hasRefundOrdersDetails = (
                from p in entity.OrderInfo
                join o in entity.OrderRefundInfo on p.Id equals o.OrderId
                join x in entity.OrderItemInfo on o.OrderId equals x.OrderId
                where p.OrderStatus == Himall.Model.OrderInfo.OrderOperateStatus.Finish &&
                o.ManagerConfirmDate >= startDate &&
                o.ManagerConfirmDate < endDate &&
                o.ManagerConfirmStatus == Himall.Model.OrderRefundInfo.OrderRefundConfirmStatus.Confirmed
                select new
            {
                Order = p,
                OrderRefund = o,
                OrderItem = x
            }
                ).Distinct().ToList();
            //符合标准的所有的订单
            var ordersDetails = (
                from p in entity.OrderInfo
                join o in entity.OrderItemInfo on p.Id equals o.OrderId
                where p.OrderStatus == Himall.Model.OrderInfo.OrderOperateStatus.Finish &&
                p.FinishDate >= startDate &&
                p.FinishDate < endDate
                select new
            {
                Order = p,
                OrderItem = o
            }
                ).ToList();

            //分组店铺统计
            List <long> shopIds = new List <long>();

            shopIds.AddRange(hasRefundOrdersDetails.Select(c => c.Order.ShopId));
            shopIds.AddRange(ordersDetails.Select(c => c.Order.ShopId));
            //shopIds.AddRange(finishedPurchaseAgreement.Select(c => c.ShopId));

            shopIds = shopIds.Distinct().ToList();

            using (TransactionScope transaction = new TransactionScope())
            {
                try
                {
                    //插入Himall_Accounts 统计表
                    foreach (var shopId in shopIds)
                    {
                        var orders = ordersDetails.Where(c => c.Order.ShopId == shopId).Select(c => c.Order).Distinct().ToList();

                        decimal productActualPaidAmount = orders.Sum(c => c.ProductTotalAmount) - orders.Sum(c => c.DiscountAmount);
                        //退单的运费不要加
                        decimal freightAmount = orders.Sum(c => c.Freight);
                        //佣金
                        decimal commissionAmount = CalculationTotalCommission(ordersDetails.Where(c => c.Order.ShopId == shopId).Select(c => c.OrderItem).Distinct().ToList());


                        //分销佣金
                        decimal Brokerage = CalculationTotalBrokerage(ordersDetails.Where(c => c.Order.ShopId == shopId).Select(c => c.OrderItem).Distinct().ToList());

                        decimal ReturnBrokerage = CalculationTotalRefundBrokerage(hasRefundOrdersDetails.Where(c => c.OrderRefund.ShopId == shopId).Select(c => c.OrderRefund).Distinct().ToList());

                        decimal refundCommissionAmount = CalculationTotalRefundCommission(hasRefundOrdersDetails.Where(c => c.OrderRefund.ShopId == shopId).Select(c => c.OrderItem).Distinct().ToList());
                        decimal refundAmount           = hasRefundOrdersDetails.Where(c => c.OrderRefund.ShopId == shopId).Select(c => c.OrderRefund).Distinct().Sum(c => c.Amount);
                        //decimal advancePaymentAmount = finishedPurchaseAgreement.Where(c => c.ShopId == shopId).Sum(c => c.AdvancePayment.Value);
                        //decimal accMetaAmount = acc.Where(e => e.ShopId == shopId).FirstOrDefault().Price;//服务费用
                        //本期应结=商品实付总额+运费—佣金—退款金额+退还佣金-服务费用-分销佣金+退还分销佣金
                        decimal periodSettlement = productActualPaidAmount + freightAmount - commissionAmount - refundAmount + refundCommissionAmount - Brokerage + ReturnBrokerage;
                        var     accountInfo      = new Model.AccountInfo();
                        accountInfo.ShopId                  = shopId;
                        accountInfo.ShopName                = entity.ShopInfo.Where(c => c.Id == shopId).FirstOrDefault().ShopName;
                        accountInfo.AccountDate             = DateTime.Now;
                        accountInfo.StartDate               = startDate;
                        accountInfo.EndDate                 = endDate.AddSeconds(-1);
                        accountInfo.Status                  = Model.AccountInfo.AccountStatus.UnAccount;
                        accountInfo.ProductActualPaidAmount = productActualPaidAmount;
                        accountInfo.FreightAmount           = freightAmount;
                        accountInfo.CommissionAmount        = commissionAmount;
                        accountInfo.RefundCommissionAmount  = refundCommissionAmount;
                        accountInfo.RefundAmount            = refundAmount;
                        //accountInfo.AdvancePaymentAmount = advancePaymentAmount;
                        accountInfo.PeriodSettlement = periodSettlement;
                        accountInfo.Brokerage        = Brokerage;
                        accountInfo.ReturnBrokerage  = ReturnBrokerage;
                        accountInfo.Remark           = string.Empty;
                        entity.AccountInfo.Add(accountInfo);

                        //插入Himall_AccountDetails 订单的结算详情表

                        //含有退款的订单
                        foreach (var order in hasRefundOrdersDetails.Where(c => c.Order.ShopId == shopId).Select(c => c.Order).Distinct().ToList())
                        {
                            var accountDetail = new Model.AccountDetailInfo();
                            accountDetail.Himall_Accounts         = accountInfo;
                            accountDetail.ShopId                  = order.ShopId;
                            accountDetail.Date                    = order.FinishDate.Value;
                            accountDetail.OrderType               = Model.AccountDetailInfo.EnumOrderType.ReturnOrder;
                            accountDetail.OrderId                 = order.Id;
                            accountDetail.ProductActualPaidAmount = order.ProductTotalAmount - order.DiscountAmount;
                            accountDetail.FreightAmount           = order.Freight;
                            accountDetail.CommissionAmount        = CalculationTotalCommission(hasRefundOrdersDetails.Where(c => c.OrderRefund.OrderId == order.Id).Select(c => c.OrderItem).Distinct().ToList());
                            accountDetail.RefundCommisAmount      = CalculationTotalRefundCommission(hasRefundOrdersDetails.Where(c => c.OrderRefund.OrderId == order.Id).Select(c => c.OrderItem).Distinct().ToList());

                            //YZY分销退款佣金
                            accountDetail.BrokerageAmount       = CalculationTotalBrokerage(hasRefundOrdersDetails.Where(c => c.OrderRefund.OrderId == order.Id).Select(c => c.OrderItem).Distinct().ToList());
                            accountDetail.ReturnBrokerageAmount = CalculationTotalRefundBrokerage(hasRefundOrdersDetails.Where(c => c.OrderRefund.OrderId == order.Id).Select(c => c.OrderRefund).Distinct().ToList());


                            accountDetail.RefundTotalAmount = hasRefundOrdersDetails.Where(c => c.OrderRefund.OrderId == order.Id).Select(c => c.OrderRefund).Distinct().Sum(c => c.Amount);
                            accountDetail.OrderDate         = order.OrderDate;
                            accountDetail.OrderRefundsDates = string.Join(";", hasRefundOrdersDetails.Where(c => c.OrderRefund.OrderId == order.Id).Select(c => c.OrderRefund.ManagerConfirmDate).Distinct());
                            entity.AccountDetailInfo.Add(accountDetail);
                        }

                        foreach (var order in orders)
                        {
                            var accountDetail = new Model.AccountDetailInfo();
                            accountDetail.Himall_Accounts         = accountInfo;
                            accountDetail.ShopId                  = order.ShopId;
                            accountDetail.Date                    = order.FinishDate.Value;
                            accountDetail.OrderType               = Model.AccountDetailInfo.EnumOrderType.FinishedOrder;
                            accountDetail.OrderId                 = order.Id;
                            accountDetail.ProductActualPaidAmount = order.ProductTotalAmount - order.DiscountAmount;
                            accountDetail.FreightAmount           = order.Freight;
                            accountDetail.CommissionAmount        = CalculationTotalCommission(ordersDetails.Where(c => c.Order.Id == order.Id).Select(c => c.OrderItem).Distinct().ToList());
                            accountDetail.RefundCommisAmount      = decimal.Zero;
                            accountDetail.RefundTotalAmount       = decimal.Zero;
                            accountDetail.BrokerageAmount         = decimal.Zero;
                            accountDetail.ReturnBrokerageAmount   = decimal.Zero;
                            accountDetail.OrderDate               = order.OrderDate;

                            accountDetail.OrderRefundsDates = string.Empty;
                            entity.AccountDetailInfo.Add(accountDetail);
                        }
                    }

                    int rows = entity.SaveChanges();
                    transaction.Complete();
                }
                catch (Exception ee)
                {
                    Log.Error("CalculationMoney :startDate=" + startDate.ToString() + " endDate=" + endDate.ToString() + "/r/n" + ee.Message);
                }
            }
            #region 营销费用*************************
            try
            {
                /*
                 * var acc = (from a in entity.AccountInfo
                 *         join m in
                 *             (from AM in entity.ActiveMarketServiceInfo
                 *              join M in entity.MarketSettingInfo on AM.TypeId equals M.TypeId
                 *              where AM.MarketServiceRecordInfo.Max(m => m.EndTime) >= endDate
                 *              select new
                 *              {
                 *                  ShopId = AM.ShopId,
                 *                  Price = M.Price,
                 *                  TypeId = M.TypeId
                 *              }) on a.ShopId equals m.ShopId
                 *         where (a.StartDate.Year <= startDate.Year && a.StartDate.Month <= startDate.Month) && a.EndDate >= endDate
                 *         select new
                 *         {
                 *             ShopId = m.ShopId,
                 *             Price = m.Price,
                 *             TypeId = m.TypeId,
                 *             Id = a.Id
                 *         }).ToList();*/

                //未结算的营销费用(当前结算开始日期之前最近的记录)
                var market = (from b in entity.ActiveMarketServiceInfo
                              join c in entity.MarketServiceRecordInfo on b.Id equals c.MarketServiceId
                              join d in shopIds on b.ShopId equals d
                              join aa in entity.MarketSettingInfo on b.TypeId equals aa.TypeId
                              where c.SettlementFlag == 0
                              select new
                {
                    ShopId = b.ShopId,
                    TypeId = b.TypeId,
                    Price = (c.EndTime.Year * 12 + c.EndTime.Month - (c.StartTime.Year * 12 + c.StartTime.Month)) * aa.Price,              //购买的月数
                    MSRecordId = c.Id,
                    StartTime = c.StartTime,
                    EndTime = c.EndTime
                }).ToList();

                var account    = entity.AccountInfo.Where(e => e.StartDate == startDate).ToList();
                var marketShop = market.Select(e => e.ShopId).Distinct();
                foreach (var item in account)
                {
                    var accInfo = market.Where(e => e.ShopId == item.ShopId);
                    foreach (var serviceType in accInfo)
                    {
                        item.PeriodSettlement     = item.PeriodSettlement - serviceType.Price;     //减掉营销服务费用
                        item.AdvancePaymentAmount = item.AdvancePaymentAmount + serviceType.Price; //存放营销服务费用
                        entity.AccountMetaInfo.Add(new Model.AccountMetaInfo
                        {
                            AccountId        = item.Id,
                            MetaKey          = serviceType.TypeId.ToDescription(),
                            MetaValue        = serviceType.Price.ToString("f2"),
                            ServiceStartTime = serviceType.StartTime,
                            ServiceEndTime   = serviceType.EndTime
                        });
                    }
                }
                var MSRecordInfos = (from a in entity.MarketServiceRecordInfo
                                     join b in entity.ActiveMarketServiceInfo on a.MarketServiceId equals b.Id
                                     join c in marketShop on b.ShopId equals c
                                     where a.SettlementFlag == 0
                                     select new
                {
                    Shopid = b.ShopId,
                    TypeId = b.TypeId,
                    Msrecordid = a.Id
                }).ToList();
                foreach (var record in MSRecordInfos)
                {
                    var recordModel = entity.MarketServiceRecordInfo.FirstOrDefault(e => e.Id == record.Msrecordid);
                    recordModel.SettlementFlag = 1;
                }
                entity.SaveChanges();
            }
            catch (Exception ex)
            {
                Log.Error("CalculationMoney 服务费:startDate=" + startDate.ToString() + " endDate=" + endDate.ToString() + "/r/n" + ex.Message);
            }
            #endregion 营销费用
        }