예제 #1
0
        /// <summary>
        /// 撤销退款申请 申请中=>已撤销
        /// </summary>
        /// <param name="refund"></param>
        public void RevokeOrderRefund(OrderRefund refund)
        {
            using (var dbContext = new OrderProcessDbContext())
            {
                //修改退款申请状态
                refund.RefundStatus = RefundStatus.Revoked;
                dbContext.Entry <OrderRefund>(refund).State = System.Data.Entity.EntityState.Modified;

                //修改订单商品退款状态
                var singleGoods = dbContext.OrderGoods.FirstOrDefault(x => x.OrderId == refund.OrderId && x.SingleGoodsId == refund.SingleGoodsId);
                if (singleGoods != null)
                {
                    singleGoods.RefundStatus = OrderRefundStatus.NoRefund;
                }

                //修改订单状态
                var order = dbContext.Orders.FirstOrDefault(x => x.Id == refund.OrderId);
                if (order != null)
                {
                    order.RefundStatus = GetOrderRefundStatus(refund, RefundStatus.Applying);
                }

                dbContext.SaveChanges();
            }
        }
예제 #2
0
        public List <StatisticSalesResult> StatisticSales()
        {
            using (var dbContext = new OrderProcessDbContext())
            {
                var startTime = DateTime.Now.AddMonths(-11).ToString("yyyy-MM-01").To <DateTime>();
                var query1    = from o in dbContext.Orders
                                where (o.OrderStatus == OrderStatus.Completed || o.OrderStatus == OrderStatus.WaitingForDelivery || o.OrderStatus == OrderStatus.WaitingForReceiving) &&
                                o.CreateTime >= startTime && o.CreateTime <= DateTime.Now
                                select new
                {
                    o.PayFee,
                    Month = o.CreateTime.Year + "-" + (o.CreateTime.Month < 10?"0":"") + o.CreateTime.Month
                };

                var query = from t in query1
                            group t by t.Month into g
                            select new StatisticSalesResult
                {
                    Month       = g.Key,
                    SalesVolume = g.Count(),
                    SalesAmount = g.Sum(c => c.PayFee)
                };

                return(query.OrderBy(g => g.Month).ToList());
            }
        }
예제 #3
0
        public List <EvaluateDetailsModel> LoadOrderEvaluateList(Guid orderId)
        {
            using (var dbContext = new OrderProcessDbContext())
            {
                var query = from g in dbContext.OrderGoods
                            join e in dbContext.Evaluates on g.Id equals e.SourceId
                            where g.OrderId == orderId && e.SourceType.Equals("Order")
                            select new EvaluateDetailsModel
                {
                    SingleGoodsId  = g.SingleGoodsId,
                    GoodsId        = g.GoodsId,
                    GoodsName      = g.GoodsName,
                    GoodsAttribute = g.GoodsAttribute,
                    Price          = g.Price,
                    Quantity       = g.Quantity,
                    Score          = e.Score,
                    Content        = e.Content,
                    IsAnonymity    = e.IsAnonymity,
                    MemberName     = e.MemberName,
                    EvaluateTime   = e.CreateTime,
                    ReplyContent   = e.ReplyContent,
                    ReplyTime      = e.ReplyTime
                };

                return(query.ToList());
            }
        }
예제 #4
0
 /// <summary>
 /// 未处理评价数量
 /// </summary>
 /// <returns></returns>
 public int CountUnDoEvalute()
 {
     using (var dbContext = new OrderProcessDbContext())
     {
         return(dbContext.EvaluateViews.Count(e => e.ReplyUserName == null));
     }
 }
예제 #5
0
 public int DeliveryRemindersCount()
 {
     using (var dbContext = new OrderProcessDbContext())
     {
         return(dbContext.OrderDeliveryReminders.Count());
     }
 }
예제 #6
0
 public int CountOrder(OrderRefundStatus refundStatus)
 {
     using (var dbContext = new OrderProcessDbContext())
     {
         return(dbContext.Orders.Count(o => o.RefundStatus == refundStatus));
     }
 }
예제 #7
0
        /// <summary>
        /// 创建订单退款申请
        /// </summary>
        /// <param name="refund"></param>
        public void CreateOrderRefund(OrderRefund refund)
        {
            using (var dbContext = new OrderProcessDbContext())
            {
                //修改订单退款状态为
                var order = dbContext.Orders.FirstOrDefault(x => x.Id == refund.OrderId);
                if (order == null)
                {
                    throw new WebApiInnerException("0002", "订单不存在");
                }
                if (order.RefundStatus != OrderRefundStatus.Refunding)
                {
                    order.RefundStatus = OrderRefundStatus.Refunding;
                }

                var singleGoods = dbContext.OrderGoods.FirstOrDefault(x => x.OrderId == refund.OrderId && x.SingleGoodsId == refund.SingleGoodsId);
                if (singleGoods == null)
                {
                    throw new WebApiInnerException("0006", "商品不存在");
                }
                singleGoods.RefundStatus = OrderRefundStatus.Refunding;

                //新增退款申请
                refund.Id           = KeyGenerator.GetGuidKey();
                refund.RefundNo     = KeyGenerator.GetOrderNumber();
                refund.CreateTime   = DateTime.Now;
                refund.RefundStatus = RefundStatus.Applying;
                dbContext.OrderRefunds.Add(refund);
                dbContext.SaveChanges();
            }
        }
예제 #8
0
 /// <summary>
 /// 根据条件获取所有商品信息
 /// </summary>
 /// <param name="expression"></param>
 /// <returns></returns>
 public List <Order> GetList(Expression <Func <Order, bool> > expression)
 {
     using (var dbContex = new OrderProcessDbContext())
     {
         var query = dbContex.Orders.Include(o => o.OrderGoods).Where(expression).ToList();
         return(query);
     }
 }
예제 #9
0
 public OrderDeliveryReminder GetNewestReminderInfo(Guid orderId, string memberId)
 {
     using (var dbContext = new OrderProcessDbContext())
     {
         var reminderInfo = dbContext.OrderDeliveryReminders.Where(c => c.OrderId.Equals(orderId) && c.MemberId.Equals(memberId)).OrderByDescending(c => c.CreateTime).FirstOrDefault();
         return(reminderInfo);
     }
 }
예제 #10
0
        /// <summary>
        /// 统计退款数量,按类型统计
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        public int CountRefundOrder(RefundType type)
        {
            using (var dbContext = new OrderProcessDbContext())
            {
                Expression <Func <ViewOrderRefund, bool> > expression =
                    l => l.OrderStatus != OrderStatus.Deleted &&
                    l.RefundStatus == RefundStatus.Applying && l.RefundType == type;

                return(dbContext.ViewOrderRefunds.Where(expression).Count());
            }
        }
예제 #11
0
 public bool CheckTodayCanRemind(Guid orderId, string memberId)
 {
     using (var dbContext = new OrderProcessDbContext())
     {
         var reminderInfo = dbContext.OrderDeliveryReminders.Where(c => c.OrderId.Equals(orderId) && c.MemberId.Equals(memberId)).OrderByDescending(c => c.CreateTime).FirstOrDefault();
         if (reminderInfo != null && reminderInfo.CreateTime.Subtract(DateTime.Now).Days == 0)
         {
             return(false);
         }
     }
     return(true);
 }
예제 #12
0
        public ApiResult GetCenterInfo()
        {
            var money    = _walletService.GetWalletByMemberId(AuthorizedUser.Id, Wallet.Models.WalletType.Cash)?.Available ?? 0;
            var integral = _walletService.GetWalletByMemberId(AuthorizedUser.Id, Wallet.Models.WalletType.Integral)?.Available ?? 0;

            var pendingPayment      = 0;
            var waitingForReceiving = 0;
            var waitingForEvaluate  = 0;
            var hasRefund           = 0;

            using (var orderDbContext = new OrderProcessDbContext())
            {
                pendingPayment      = orderDbContext.Orders.Count(o => o.OrderStatus == OrderProcess.Models.OrderStatus.PendingPayment && o.MemberId.Equals(AuthorizedUser.Id, StringComparison.OrdinalIgnoreCase));
                waitingForReceiving = orderDbContext.Orders.Count(o => (o.OrderStatus == OrderProcess.Models.OrderStatus.WaitingForDelivery || o.OrderStatus == OrderProcess.Models.OrderStatus.WaitingForReceiving) && o.MemberId.Equals(AuthorizedUser.Id, StringComparison.OrdinalIgnoreCase));
                waitingForEvaluate  = orderDbContext.Orders.Count(o => o.OrderStatus == OrderProcess.Models.OrderStatus.Completed && o.EvaluateStatus == OrderProcess.Models.EvaluateStatus.NotEvaluated && o.RefundStatus == OrderProcess.Models.OrderRefundStatus.NoRefund && o.MemberId.Equals(AuthorizedUser.Id, StringComparison.OrdinalIgnoreCase));
                hasRefund           = orderDbContext.Orders.Count(o => o.RefundStatus == OrderProcess.Models.OrderRefundStatus.Refunding && o.MemberId.Equals(AuthorizedUser.Id, StringComparison.OrdinalIgnoreCase));
            }

            var todayIncome = _walletService.Sum(AuthorizedUser.Id, Wallet.Models.WalletType.Cash, Wallet.Models.BillType.TakeIn, "commision", DateTime.Now.DayZero(), DateTime.Now.DayEnd());
            var totalIncome = _walletService.Sum(AuthorizedUser.Id, Wallet.Models.WalletType.Cash, Wallet.Models.BillType.TakeIn, "commision");

            var teamCount = _currencyService.Count <Member>(m => m.ParentIds.Contains(AuthorizedUser.Id));
            //var maxLevel = _configService.Get<SystemConfig>().MaxLevel;
            //if (maxLevel > 3) maxLevel = 3;
            //using (var memberDbContext = new MemberDbContext())
            //{
            //    CountChilds(memberDbContext, AuthorizedUser.Id, maxLevel, ref teamCount);
            //}//end

            var member = _memberService.FindMemberById(AuthorizedUser.Id);
            var result = new ApiResult();

            result.SetData(new
            {
                Money    = money,
                Integral = integral,

                PendingPayment      = pendingPayment,
                WaitingForReceiving = waitingForReceiving,
                WaitingForEvaluate  = waitingForEvaluate,
                HasRefund           = hasRefund,

                TodayIncome = todayIncome,
                TotalIncome = totalIncome,
                TeamCount   = teamCount,

                MemberType = member?.MemberType ?? MemberType.General
            });
            return(result);
        }
예제 #13
0
        public int SalesVolumeToday()
        {
            using (var dbContext = new OrderProcessDbContext())
            {
                var startTime = DateTime.Now.DayZero();
                var endTime   = DateTime.Now.DayEnd();

                return
                    (dbContext.Orders.Count(
                         o =>
                         o.CreateTime >= startTime && o.CreateTime <= endTime &&
                         (o.OrderStatus == OrderStatus.WaitingForDelivery ||
                          o.OrderStatus == OrderStatus.WaitingForReceiving || o.OrderStatus == OrderStatus.Completed)));
            }
        }
예제 #14
0
        public decimal SalesAmountToday()
        {
            using (var dbContext = new OrderProcessDbContext())
            {
                var startTime = DateTime.Now.DayZero();
                var endTime   = DateTime.Now.DayEnd();

                return
                    (dbContext.Orders.Where(
                         o =>
                         o.CreateTime >= startTime && o.CreateTime <= endTime &&
                         (o.OrderStatus == OrderStatus.WaitingForDelivery ||
                          o.OrderStatus == OrderStatus.WaitingForReceiving || o.OrderStatus == OrderStatus.Completed))
                     .Sum(o => (decimal?)o.PayFee) ?? 0);
            }
        }
예제 #15
0
        public List <OrderGoodsEvaluateViewModel> LoadOrderGoodsEvaluateList(Guid orderId)
        {
            using (var dbContext = new OrderProcessDbContext())
            {
                var query = from g in dbContext.OrderGoods
                            join e in dbContext.Evaluates on g.Id equals e.SourceId
                            where g.OrderId == orderId && e.SourceType.Equals("Order")
                            select new OrderGoodsEvaluateViewModel
                {
                    OrderGoods = g,
                    Evaluate   = e
                };

                return(query.ToList());
            }
        }
예제 #16
0
        public Order Load(Guid orderId)
        {
            using (var dbContext = new OrderProcessDbContext())
            {
                var order = dbContext.Orders.Where(o => o.Id.Equals(orderId)).Include(o => o.OrderActions).Include(o => o.OrderGoods).FirstOrDefault();

                if (order != null)
                {
                    foreach (var goods in order.OrderGoods)
                    {
                        goods.GoodsImage = _storageFileService.GetFiles(goods.Id, OrderProcessModule.Key, "GoodsImage").FirstOrDefault();
                    }
                }

                return(order);
            }
        }
예제 #17
0
        public int CancelTimeOutOrder(DateTime outTime)
        {
            var count = 0;

            using (var dbContext = new OrderProcessDbContext())
            {
                var orders = dbContext.Orders.Where(o => o.OrderStatus == OrderStatus.PendingPayment && o.CreateTime < outTime).ToList();
                foreach (var order in orders)
                {
                    order.OrderStatus = OrderStatus.Closed;
                    if (ChangeOrderStatus(order.Id, order.OrderStatus))
                    {
                        count++;
                    }
                }
                return(count);
            }
        }
예제 #18
0
        public int CompleteTimeOutOrder(DateTime outTime)
        {
            var count = 0;

            using (var dbContext = new OrderProcessDbContext())
            {
                var orders = dbContext.Orders.Where(o => o.OrderStatus == OrderStatus.WaitingForReceiving && o.ShippingTime < outTime).ToList();
                foreach (var order in orders)
                {
                    order.OrderStatus = OrderStatus.Completed;
                    if (ChangeOrderStatus(order.Id, order.OrderStatus))
                    {
                        count++;
                    }
                }
                return(count);
            }
        }
예제 #19
0
        public void AfterReplayOrderEvaluates(Guid orderId)
        {
            using (var dbContext = new OrderProcessDbContext())
            {
                var order = dbContext.Orders.FirstOrDefault(x => x.Id == orderId);
                if (order != null)
                {
                    var oldEvaluateStatus = order.EvaluateStatus;
                    order.EvaluateStatus         = EvaluateStatus.Replied;
                    dbContext.Entry(order).State = System.Data.Entity.EntityState.Modified;

                    var currentUser = _userContainer.CurrentUser;
                    dbContext.OrderActions.Add(new OrderAction
                    {
                        Id             = KeyGenerator.GetGuidKey(),
                        OrderId        = order.Id,
                        Memo           = "评价回复",
                        CreateTime     = DateTime.Now,
                        OrderStatus    = order.OrderStatus,
                        PayStatus      = order.PayStatus,
                        ShippingStatus = order.ShippingStatus,
                        EvaluateStatus = order.EvaluateStatus,
                        RefundStatus   = order.RefundStatus,
                        UserId         = currentUser.Id,
                        UserName       = currentUser.UserName
                    });

                    if (dbContext.SaveChanges() > 0)
                    {
                        Logger.Operation($"订单{order.OrderNo}评价回复,修改订单评价状态为已回复", OrderProcessModule.Instance);

                        foreach (var proxy in _orderServiceProxy)
                        {
                            if (proxy.ModuleKey().Equals(order.ModuleKey, StringComparison.OrdinalIgnoreCase))
                            {
                                proxy.AfterChangeEvaluateStatus(order, oldEvaluateStatus);
                            }
                        }
                    }
                }
            }
        }
예제 #20
0
        public void SubmitOrder(Order order, List <OrderGoods> orderGoods)
        {
            Argument.ThrowIfNullOrEmpty(order.ModuleKey, "ModuleKey");

            using (var dbContext = new OrderProcessDbContext())
            {
                if (order.Id.Equals(Guid.Empty))
                {
                    order.Id = KeyGenerator.GetGuidKey();
                    foreach (var goods in orderGoods)
                    {
                        goods.Id      = KeyGenerator.GetGuidKey();
                        goods.OrderId = order.Id;
                    }
                }
                if (string.IsNullOrEmpty(order.OrderNo))
                {
                    order.OrderNo = KeyGenerator.GetOrderNumber();
                }

                dbContext.Orders.Add(order);
                dbContext.OrderGoods.AddRange(orderGoods);
                if (dbContext.SaveChanges() > 0)
                {
                    order.OrderGoods = orderGoods;
                    foreach (var proxy in _orderServiceProxy)
                    {
                        if (proxy.ModuleKey().Equals(order.ModuleKey, StringComparison.OrdinalIgnoreCase))
                        {
                            proxy.AfterSubmitOrder(order);
                        }
                    }
                    foreach (var goods in orderGoods)
                    {
                        if (goods.GoodsImage != null)
                        {
                            _storageFileService.AssociateFile(goods.Id, OrderProcessModule.Key, OrderProcessModule.DisplayName, goods.GoodsImage.Id, "GoodsImage");
                        }
                    }
                }
            }
        }
예제 #21
0
        public List <Order> LoadByPage(string memberId, out int totalCount, OrderStatus?orderStatus = null, PayStatus?payStatus = null, ShippingStatus?shippingStatus = null, int pageIndex = 1, int pageSize = 10)
        {
            using (var dbContext = new OrderProcessDbContext())
            {
                totalCount = dbContext.Orders.Count();
                var orders =
                    dbContext.Orders.Where(o => o.MemberId.Equals(memberId, StringComparison.OrdinalIgnoreCase) && o.OrderStatus != OrderStatus.Deleted && (orderStatus == null || o.OrderStatus == orderStatus.Value) && (payStatus == null || o.PayStatus == payStatus.Value) && (shippingStatus == null || o.ShippingStatus == shippingStatus.Value)).Include(o => o.OrderGoods).OrderByDescending(o => o.CreateTime).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();

                foreach (var order in orders)
                {
                    foreach (var goods in order.OrderGoods)
                    {
                        goods.GoodsImage =
                            _storageFileService.GetFiles(goods.Id, OrderProcessModule.Key, "GoodsImage")
                            .FirstOrDefault();
                    }
                }
                return(orders);
            }
        }
예제 #22
0
        public List <Order> LoadByPage(string memberId, out int totalCount, OrderStatus?orderStatus = null, PayStatus?payStatus = null, ShippingStatus?shippingStatus = null, EvaluateStatus?evaluateStatus = null, OrderRefundStatus?refundStatus = null, string keywords = "", int pageIndex = 1, int pageSize = 10, OrderStatus?extentOrderStatus = null, OrderRefundStatus?extentRefundStatus = null)
        {
            using (var dbContext = new OrderProcessDbContext())
            {
                var noKeywords = string.IsNullOrWhiteSpace(keywords);
                var query      =
                    dbContext.Orders.Where(o => o.MemberId.Equals(memberId, StringComparison.OrdinalIgnoreCase) && o.OrderStatus != OrderStatus.Deleted && (orderStatus == null || (o.OrderStatus == orderStatus.Value || (extentOrderStatus != null && o.OrderStatus == extentOrderStatus.Value))) && (payStatus == null || o.PayStatus == payStatus.Value) && (shippingStatus == null || o.ShippingStatus == shippingStatus.Value) && (evaluateStatus == null || o.EvaluateStatus == evaluateStatus.Value) && (refundStatus == null || (o.RefundStatus == refundStatus.Value || (extentRefundStatus != null && o.RefundStatus == extentRefundStatus.Value))) && (noKeywords || o.OrderNo.Contains(keywords))).Include(o => o.OrderGoods).OrderByDescending(o => o.CreateTime);

                totalCount = query.Count();
                var orders = query.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
                foreach (var order in orders)
                {
                    foreach (var goods in order.OrderGoods)
                    {
                        goods.GoodsImage =
                            _storageFileService.GetFiles(goods.Id, OrderProcessModule.Key, "GoodsImage")
                            .FirstOrDefault();
                    }
                }
                return(orders);
            }
        }
예제 #23
0
        public bool SetShippingInfo(Guid orderId, Guid shippingId, string shippingName, string shippingCode, string shippingNo)
        {
            using (var dbContext = new OrderProcessDbContext())
            {
                var order = dbContext.Orders.Include(o => o.OrderGoods).FirstOrDefault(o => o.Id.Equals(orderId));
                if (order != null && (!order.ShippingId.Equals(shippingId) || !order.ShippingNo.Equals(shippingNo, StringComparison.OrdinalIgnoreCase)))
                {
                    var memo = $"修改物流:{order.ShippingName}[{order.ShippingNo}]->{shippingName}[{shippingNo}]";
                    order.ShippingId   = shippingId;
                    order.ShippingName = shippingName;
                    order.ShippingCode = shippingCode;
                    order.ShippingNo   = shippingNo;
                    if (order.ShippingTime == null)
                    {
                        order.ShippingTime = DateTime.Now;
                    }
                    dbContext.Entry(order).State = EntityState.Modified;

                    var currentUser = _userContainer.CurrentUser;
                    dbContext.OrderActions.Add(new OrderAction
                    {
                        Id             = KeyGenerator.GetGuidKey(),
                        OrderId        = orderId,
                        Memo           = memo,
                        CreateTime     = DateTime.Now,
                        OrderStatus    = order.OrderStatus,
                        PayStatus      = order.PayStatus,
                        ShippingStatus = order.ShippingStatus,
                        EvaluateStatus = order.EvaluateStatus,
                        UserId         = currentUser?.Id ?? Guid.Empty.ToString(),
                        UserName       = currentUser?.UserName ?? "系统"
                    });
                    return(dbContext.SaveChanges() > 0);
                }
                return(false);
            }
        }
예제 #24
0
        /// <summary>
        /// 订单列表金额统计
        /// </summary>
        /// <returns></returns>
        public ActionResult StateOrderList()
        {
            var result = new DataJsonResult();
            //取查询条件
            var orderNo      = Request.Get("OrderNo");
            var checkOrderNo = string.IsNullOrWhiteSpace(orderNo);

            var consignee      = Request.Get("Consignee");
            var checkConsignee = string.IsNullOrWhiteSpace(consignee);

            var memberName      = Request.Get("MemberName");
            var checkMemberName = string.IsNullOrWhiteSpace(memberName);

            var orderStatus      = Request.Get("OrderStatus");
            var checkOrderStatus = string.IsNullOrWhiteSpace(orderStatus);
            var orderStatusInt   = orderStatus.To <int>();

            var refundStatus      = Request.Get("RefundStatus");
            var checkRefundStatus = string.IsNullOrWhiteSpace(refundStatus);
            var refundStatusInt   = refundStatus.To <int>();

            var payStatus      = Request.Get("PayStatus");
            var checkPayStatus = string.IsNullOrWhiteSpace(payStatus);
            var payStatusInt   = payStatus.To <int>();

            var shippingStatus      = Request.Get("ShippingStatus");
            var checkShippingStatus = string.IsNullOrWhiteSpace(shippingStatus);
            var shippingStatusInt   = shippingStatus.To <int>();

            var createTimeBegin      = Request.Get("CreateTimeBegin");
            var checkCreateTimeBegin = string.IsNullOrWhiteSpace(createTimeBegin);
            var createTimeBeginTime  = createTimeBegin.To <DateTime>().DayZero();

            var createTimeEnd      = Request.Get("CreateTimeEnd");
            var checkCreateTimeEnd = string.IsNullOrWhiteSpace(createTimeEnd);
            var createTimeEndTime  = createTimeEnd.To <DateTime>().DayEnd();

            var paymentId      = Request.Get("PaymentId");
            var checkPaymentId = string.IsNullOrWhiteSpace(paymentId);

            Expression <Func <Order, bool> > expression =
                l => (checkOrderNo || l.OrderNo.Contains(orderNo)) &&
                (checkConsignee || l.Consignee.Contains(consignee)) &&
                (checkMemberName || l.MemberName.Contains(memberName)) &&
                l.OrderStatus != OrderStatus.Deleted &&
                (checkOrderStatus || (int)l.OrderStatus == orderStatusInt) &&
                (checkRefundStatus || (int)l.RefundStatus == refundStatusInt) &&
                (checkPayStatus || (int)l.PayStatus == payStatusInt) &&
                (checkPaymentId || l.PaymentId.ToString() == paymentId) &&
                (checkShippingStatus || (int)l.ShippingStatus == shippingStatusInt) &&
                (checkCreateTimeBegin || l.CreateTime >= createTimeBeginTime) &&
                (checkCreateTimeEnd || l.CreateTime <= createTimeEndTime);


            //统计
            var totalOrderAmount   = 0M;
            var totalPayFee        = 0M;
            var totalRefundFee     = 0M;
            var totalGoodsAmount   = 0M;
            var totalCouponMoney   = 0M;
            var totalIntegralMoney = 0M;
            var totalShippingFee   = 0M;

            using (var dbContext = new OrderProcessDbContext())
            {
                var query = dbContext.Orders.Where(expression);
                totalOrderAmount   = query.Sum(me => (decimal?)me.OrderAmount) ?? 0;
                totalPayFee        = query.Sum(me => (decimal?)me.PayFee) ?? 0;
                totalRefundFee     = query.Sum(me => (decimal?)me.RefundFee) ?? 0;
                totalGoodsAmount   = query.Sum(me => (decimal?)me.GoodsAmount) ?? 0;
                totalCouponMoney   = query.Sum(me => (decimal?)me.CouponMoney) ?? 0;
                totalIntegralMoney = query.Sum(me => (decimal?)me.IntegralMoney) ?? 0;
                totalShippingFee   = query.Sum(me => (decimal?)me.ShippingFee) ?? 0;
            }
            result.Data = new
            {
                TotalOrderAmount   = totalOrderAmount,
                TotalPayFee        = totalPayFee,
                TotalRefundFee     = totalRefundFee,
                TotalGoodsAmount   = totalGoodsAmount,
                TotalCouponMoney   = totalCouponMoney,
                TotalIntegralMoney = totalIntegralMoney,
                TotalShippingFee   = totalShippingFee
            };
            return(Json(result));
        }
예제 #25
0
        public bool ChangeOrderStatus(Guid orderId, OrderStatus orderStatus, PayStatus?payStatus = null, ShippingStatus?shippingStatus = null, EvaluateStatus?evaluateStatus = null, string memo = "")
        {
            using (var dbContext = new OrderProcessDbContext())
            {
                var order = dbContext.Orders.Include(o => o.OrderGoods).FirstOrDefault(o => o.Id.Equals(orderId));
                if (order != null)
                {
                    var oldOrderStatus    = order.OrderStatus;
                    var oldPayStatus      = order.PayStatus;
                    var oldShippingStatus = order.ShippingStatus;
                    var oldEvaluateStatus = order.EvaluateStatus;
                    order.OrderStatus = orderStatus;
                    if (payStatus != null)
                    {
                        order.PayStatus = payStatus.Value;
                    }
                    if (shippingStatus != null)
                    {
                        order.ShippingStatus = shippingStatus.Value;
                    }
                    if (evaluateStatus != null)
                    {
                        order.EvaluateStatus = evaluateStatus.Value;
                    }

                    dbContext.Entry(order).State = EntityState.Modified;
                    var currentUser = _userContainer.CurrentUser;
                    dbContext.OrderActions.Add(new OrderAction
                    {
                        Id             = KeyGenerator.GetGuidKey(),
                        OrderId        = orderId,
                        Memo           = memo,
                        CreateTime     = DateTime.Now,
                        OrderStatus    = order.OrderStatus,
                        PayStatus      = order.PayStatus,
                        ShippingStatus = order.ShippingStatus,
                        EvaluateStatus = order.EvaluateStatus,
                        UserId         = currentUser?.Id ?? Guid.Empty.ToString(),
                        UserName       = currentUser?.UserName ?? "系统"
                    });

                    if (dbContext.SaveChanges() > 0)
                    {
                        foreach (var proxy in _orderServiceProxy)
                        {
                            if (proxy.ModuleKey().Equals(order.ModuleKey, StringComparison.OrdinalIgnoreCase))
                            {
                                proxy.AfterChangeOrderStatus(order, oldOrderStatus);
                                if (payStatus != null)
                                {
                                    proxy.AfterChangePayStatus(order, oldPayStatus);
                                }
                                if (shippingStatus != null)
                                {
                                    proxy.AfterChangeShippingStatus(order, oldShippingStatus);
                                }
                                if (evaluateStatus != null)
                                {
                                    proxy.AfterChangeEvaluateStatus(order, oldEvaluateStatus);
                                }
                            }
                        }
                        return(true);
                    }
                }
                return(false);
            }
        }
예제 #26
0
        public bool ChangePrice(Guid orderId, Guid orderGoodsId, decimal goodsPrice)
        {
            using (var dbContext = new OrderProcessDbContext())
            {
                var order = dbContext.Orders.FirstOrDefault(o => o.Id.Equals(orderId));
                if (order == null || order.OrderStatus != OrderStatus.PendingPayment)
                {
                    throw new Exception("订单状态不合法");
                }
                else
                {
                    var orderGoods = dbContext.OrderGoods.FirstOrDefault(og => og.Id.Equals(orderGoodsId));
                    if (orderGoods == null)
                    {
                        throw new Exception("订单商品未找到");
                    }
                    else
                    {
                        var oldGoodsPrice = orderGoods.Price;
                        orderGoods.Price = goodsPrice;

                        //差价
                        var difference = (orderGoods.Price - oldGoodsPrice) * orderGoods.Quantity;

                        //计算商品总价
                        order.GoodsAmount = order.GoodsAmount + difference; //order.OrderGoods.Sum(g => g.Price * g.Quantity);
                        //计算订单总价
                        order.OrderAmount = order.GoodsAmount + order.ShippingFee;

                        //计算之前折抵的积分还值多少钱
                        var systemConfig  = _configService.Get <SystemConfig>();
                        var integralMoney = (decimal)order.Integral / 100 * systemConfig.DiscountRate;

                        using (TransactionScope scope = new TransactionScope())
                        {
                            //如果是降价,并且抵扣的费用比商品总价高了,退还积分
                            string error = null;
                            if (oldGoodsPrice > orderGoods.Price && order.GoodsAmount < integralMoney)
                            {
                                //新费用需要多少积分
                                var integral = (int)(order.GoodsAmount / systemConfig.DiscountRate * 100);
                                //计算节省了多少积分
                                var refundIntegral = order.Integral - integral;
                                order.Integral      = integral;
                                order.IntegralMoney = order.GoodsAmount;

                                _walletService.Deposit(order.MemberId, Wallet.Models.WalletType.Integral, refundIntegral, "修改订单产品价格,退还积分", out error);
                            }

                            if (string.IsNullOrWhiteSpace(error))
                            {
                                //计算需要支付的费用
                                order.PayFee   = order.GoodsAmount - order.IntegralMoney + order.ShippingFee;
                                order.UnpayFee = order.PayFee;

                                dbContext.Entry(orderGoods).State = EntityState.Modified;
                                dbContext.Entry(order).State      = EntityState.Modified;
                                Logger.Operation(
                                    $"{_userContainer.CurrentUser.UserName}修改了订单{order.OrderNo}中的商品【{orderGoods.GoodsName}】的价格为{orderGoods.Price}",
                                    OrderProcessModule.Instance, SecurityLevel.Danger);
                                if (dbContext.SaveChanges() > 0)
                                {
                                    scope.Complete();
                                }
                                return(true);
                            }
                        }
                    }
                }
            }

            return(false);
        }