public ActionResult CreateRMA(string orderNo)
        {
            string errorMsg = string.Empty;
            var orderEntity = _orderRepo.Get(o => o.OrderNo == orderNo && o.Status == (int)OrderStatus.Convert2Sales).FirstOrDefault();
            if (orderEntity == null)
                errorMsg = "订单状态不能创建退货单!";
            var rmaEntity = _rmaRepo.Get(r => r.OrderNo == orderNo && (r.Status == (int)RMAStatus.Created || r.Status == (int)RMAStatus.PackageReceived))
                                .FirstOrDefault();
            if (rmaEntity != null)
                errorMsg += "订单已经创建了退货单,请将已有退货单作废,然后再创建!";
            if (!string.IsNullOrEmpty(errorMsg))
            {
                return new HttpStatusCodeResult((int)HttpStatusCode.InternalServerError, errorMsg);
            }
            if (!OrderViewModel.IsAuthorized(orderEntity.StoreId, orderEntity.BrandId, out errorMsg))
            {
                return new HttpStatusCodeResult((int)HttpStatusCode.InternalServerError, errorMsg);
            }
            var orderItemEntity = _orderItemRepo.Get(o => o.Status != (int)DataStatus.Deleted && o.OrderNo == orderNo).FirstOrDefault();
            using (var ts = new TransactionScope())
            {
                var newEntity = _rmaRepo.Insert(new RMAEntity()
                {
                    RMAAmount = orderEntity.TotalAmount,
                    Status = (int)RMAStatus.Created,
                    OrderNo = orderEntity.OrderNo,
                    CreateDate = DateTime.Now,
                    CreateUser = CurrentUser.CustomerId,
                    Reason = "现场退货",
                    RMANo = OrderRule.CreateRMACode(),
                    RMAType = (int)RMAType.FromOffline,
                    UpdateDate = DateTime.Now,
                    UpdateUser = CurrentUser.CustomerId
                });
                _rmaitemRepo.Insert(new RMAItemEntity()
                {
                    ItemPrice = orderItemEntity.ItemPrice,
                    ProductDesc = orderItemEntity.ProductDesc,
                    ProductId = orderItemEntity.ProductId,
                    Quantity = orderItemEntity.Quantity,
                    RMANo = newEntity.RMANo,
                    Status = (int)DataStatus.Normal,
                    UnitPrice = orderItemEntity.UnitPrice,
                    ExtendPrice = orderItemEntity.ExtendPrice,
                    CreateDate = DateTime.Now,
                    StoreDesc = orderItemEntity.StoreItemDesc,
                    StoreItem = orderItemEntity.StoreItemNo,
                    UpdateDate = DateTime.Now
                });
                _rmalogRepo.Insert(new RMALogEntity()
                {
                    CreateDate = DateTime.Now,
                    CreateUser = CurrentUser.CustomerId,
                    Operation = "创建线下退货单",
                    RMANo = newEntity.RMANo
                });
                ts.Complete();
            }
            var model = new OrderViewModel().FromEntity<OrderViewModel>(orderEntity, o =>
            {
                o.RMAs = _rmaRepo.Get(r => r.OrderNo == o.OrderNo)
                         .GroupJoin(_rmaitemRepo.GetAll(), ou => ou.RMANo, i => i.RMANo, (ou, i) => new { R = ou, RI = i.FirstOrDefault() })
                         .OrderByDescending(r => r.R.CreateDate)
                         .ToList()
                         .Select(r => new RMAViewModel().FromEntity<RMAViewModel>(r.R, rm =>
                         {
                             rm.Item = new RMAItemViewModel().FromEntity<RMAItemViewModel>(r.RI);
                         }));


            });
            return PartialView("_RMAList", model);
        }
        public ActionResult Void(OrderViewModel orderIn)
        {
            ExcludeModelFieldsFromValidate(new string[] { "Items", "Customer." });
            if (string.IsNullOrEmpty(orderIn.VoidReason))
            {
                ModelState.AddModelError("", "必须填写作废原因");
                return View(orderIn);
            }
            var order = _orderRepo.Get(o => o.OrderNo == orderIn.OrderNo).First();
            string errorMsg;
            if (!OrderViewModel.IsAuthorized(order.StoreId, order.BrandId, out errorMsg))
            {
                ViewBag.Message = errorMsg;
                return View(orderIn);
            }
            using (var ts = new TransactionScope())
            {

                order.Status = (int)OrderStatus.Void;
                order.UpdateDate = DateTime.Now;
                order.UpdateUser = CurrentUser.CustomerId;
                _orderRepo.Update(order);

                _orderLogRepo.Insert(new OrderLogEntity()
                {
                    OrderNo = orderIn.OrderNo,
                    CreateDate = DateTime.Now,
                    CreateUser = CurrentUser.CustomerId,
                    CustomerId = CurrentUser.CustomerId,
                    Operation = string.Format("作废订单:{0}",orderIn.VoidReason),
                    Type = (int)OrderOpera.FromOperator
                });
                ts.Complete();
            }
            return RedirectToAction("Details", new { OrderNo = orderIn.OrderNo });
        }
        public ActionResult VoidRMA(string rmano)
        {
            var rmaEntity = _rmaRepo.Get(o => o.RMANo == rmano).FirstOrDefault();
            if (rmaEntity == null)
                return new HttpStatusCodeResult((int)HttpStatusCode.InternalServerError, "数据异常");
            if (rmaEntity.Status != (int)RMAStatus.Created)
                return new HttpStatusCodeResult((int)HttpStatusCode.InternalServerError, "退货单状态不能取消。");
            string errorMsg;
            var orderEntity = _orderRepo.Get(o => o.OrderNo == rmaEntity.OrderNo).First();
            if (!OrderViewModel.IsAuthorized(orderEntity.StoreId, orderEntity.BrandId, out errorMsg))
            {
                return new HttpStatusCodeResult((int)HttpStatusCode.InternalServerError, errorMsg);
            }
            using (var ts = new TransactionScope())
            {
                rmaEntity.UpdateDate = DateTime.Now;
                rmaEntity.Status = (int)RMAStatus.Void;
                rmaEntity.UpdateUser = CurrentUser.CustomerId;
                _rmaRepo.Update(rmaEntity);

                _rmalogRepo.Insert(new RMALogEntity()
                {
                    CreateDate = DateTime.Now,
                    CreateUser = CurrentUser.CustomerId,
                    Operation = "作废订单!",
                    RMANo = rmano
                });
                ts.Complete();
            }

            var model = new OrderViewModel().FromEntity<OrderViewModel>(orderEntity, o =>
            {
                o.RMAs = _rmaRepo.Get(r => r.OrderNo == o.OrderNo)
                         .GroupJoin(_rmaitemRepo.GetAll(), ou => ou.RMANo, i => i.RMANo, (ou, i) => new { R = ou, RI = i.FirstOrDefault() })
                         .OrderByDescending(r => r.R.CreateDate)
                         .ToList()
                         .Select(r => new RMAViewModel().FromEntity<RMAViewModel>(r.R, rm =>
                         {
                             rm.Item = new RMAItemViewModel().FromEntity<RMAItemViewModel>(r.RI);
                         }));


            });
            return PartialView("_RMAList", model);
        }
 public ActionResult Void(string orderNo)
 {
     var linq = _orderRepo.Get(o => o.OrderNo == orderNo);
     linq = _userAuthRepo.AuthFilter(linq, CurrentUser.CustomerId, CurrentUser.Role) as IQueryable<OrderEntity>;
     var order = linq.FirstOrDefault();
     if (order == null)
     {
         throw new ArgumentNullException("orderNo");
     }
     var model = new OrderViewModel().FromEntity<OrderViewModel>(order);
     return View(model);
 }
        public ActionResult Shipping(OrderViewModel item, string orderNo)
        {
            item.Status = (int)OrderStatus.Shipped;
            if (!ModelState.IsValid)
            {
                var order = _orderRepo.Context.Set<OrderItemEntity>().Where(o => o.OrderNo == orderNo).FirstOrDefault();
                ViewBag.OrderNo = orderNo;
                return View(new OrderViewModel().FromEntity<OrderViewModel>(order));
            }
            var itemEntity = _orderRepo.Get(o => o.OrderNo == orderNo).First();
            string errorMsg;
            if (!OrderViewModel.IsAuthorized(itemEntity.StoreId, itemEntity.BrandId, out errorMsg))
            {
                ViewBag.OrderNo = orderNo;
                ModelState.AddModelError(string.Empty, errorMsg);
                ViewBag.OrderNo = orderNo;
                return View(new OrderViewModel().FromEntity<OrderViewModel>(itemEntity));
            }
            if (itemEntity.Status != (int)OrderStatus.PreparePack)
            {
                ViewBag.OrderNo = orderNo;
                ViewBag.Message = "订单状态无法发货";
                return RedirectToAction("Details", new { OrderNo = orderNo });
            }
            using (var ts = new TransactionScope())
            {
                var outboundEntity = _outboundRepo.Get(o => o.SourceNo == orderNo && o.SourceType == (int)OutboundType.Order).FirstOrDefault();
                outboundEntity.Status = (int)OutboundStatus.Shipped;
                outboundEntity.UpdateDate = DateTime.Now;
                outboundEntity.UpdateUser = CurrentUser.CustomerId;
                _outboundRepo.Update(outboundEntity);

                itemEntity.ShippingVia = item.ShippingVia;
                itemEntity.ShippingNo = item.ShippingNo;
                itemEntity.Status = (int)OrderStatus.Shipped;
                itemEntity.UpdateDate = DateTime.Now;
                itemEntity.UpdateUser = CurrentUser.CustomerId;
                _orderRepo.Update(itemEntity);

                _orderLogRepo.Insert(new OrderLogEntity()
                {
                    OrderNo = orderNo,
                    CreateDate = DateTime.Now,
                    CreateUser = CurrentUser.CustomerId,
                    CustomerId = CurrentUser.CustomerId,
                    Operation = "填写快递信息并发货。",
                    Type = (int)OrderOpera.FromOperator
                });
                ts.Complete();
            }
            return RedirectToAction("Details", new { OrderNo = orderNo });
        }
 public ActionResult Shipping(string orderNo)
 {
     var order = _orderRepo.Context.Set<OrderItemEntity>().Where(o => o.OrderNo == orderNo).FirstOrDefault();
     if (order == null)
     {
         throw new ArgumentNullException("orderNo");
     }
     var model = new OrderViewModel().FromEntity<OrderViewModel>(order);
     ViewBag.OrderNo = orderNo;
     return View(model);
 }
 public ActionResult Edit(OrderViewModel model)
 {
     ExcludeModelFieldsFromValidate(new string[] {"Items","Customer." });
     if (!ModelState.IsValid)
     {
         return View(model);
     }
     var linq = Context.Set<OrderEntity>().Where(o => o.OrderNo == model.OrderNo);
     linq = _userAuthRepo.AuthFilter(linq, CurrentUser.CustomerId, CurrentUser.Role) as IQueryable<OrderEntity>;
     var orderEntity = linq.FirstOrDefault();
     if (orderEntity == null)
     {
         ViewBag.Message = "订单不存在";
         return View(model);
     }
     var sb = new StringBuilder();
     sb.Append("修改订单:");
     using (var ts = new TransactionScope())
     {
         if (orderEntity.ShippingAddress != model.ShippingAddress)
         {
             sb.AppendFormat("原送货地址:{0}", orderEntity.ShippingAddress);
             orderEntity.ShippingAddress = model.ShippingAddress;  
         }
         if (orderEntity.ShippingContactPerson != model.ShippingContactPerson)
         {
             sb.AppendFormat(",原送货联系人:{0}", orderEntity.ShippingContactPerson);
             orderEntity.ShippingContactPerson = model.ShippingContactPerson;
         }
         if (orderEntity.ShippingContactPhone != model.ShippingContactPhone)
         {
             sb.AppendFormat(",原联系电话:{0}", orderEntity.ShippingContactPhone);
             orderEntity.ShippingContactPhone = model.ShippingContactPhone;
         }
         if (orderEntity.ShippingZipCode != model.ShippingZipCode)
         {
             sb.AppendFormat(",原送货地址邮编:{0}", orderEntity.ShippingZipCode);
             orderEntity.ShippingZipCode = model.ShippingZipCode;
         }
         if (orderEntity.NeedInvoice != model.NeedInvoice)
         {
             sb.AppendFormat(",原是否需要发票:{0}", orderEntity.NeedInvoice);
             orderEntity.NeedInvoice = model.NeedInvoice;
         }
         if (orderEntity.InvoiceSubject != model.InvoiceSubject)
         {
             sb.AppendFormat(",原发票抬头:{0}", orderEntity.InvoiceSubject);
             orderEntity.InvoiceSubject = model.InvoiceSubject;
         }
         if (orderEntity.InvoiceDetail != model.InvoiceDetail)
         {
             sb.AppendFormat(",原发票明细:{0}", orderEntity.InvoiceDetail);
             orderEntity.InvoiceDetail = model.InvoiceDetail;
         }
         _orderRepo.Update(orderEntity);
         _orderLogRepo.Insert(new OrderLogEntity() { 
              CreateDate = DateTime.Now,
               CreateUser = CurrentUser.CustomerId,
                CustomerId =CurrentUser.CustomerId,
                 Operation = sb.ToString(),
                  OrderNo = orderEntity.OrderNo,
                   Type = (int)OrderOpera.EditOrder
         });
         ts.Complete();
       
     }
     return RedirectToAction("Details", new { OrderNo = model.OrderNo});
 }
        public ActionResult Details(string orderNo)
        {
            var linq = _orderRepo.Get(o => o.OrderNo == orderNo);
            linq = _userAuthRepo.AuthFilter(linq, CurrentUser.CustomerId, CurrentUser.Role) as IQueryable<OrderEntity>;
            var order = linq.FirstOrDefault();
            if (order == null)
            {
                throw new ArgumentNullException("orderNo");
            }
            var model = new OrderViewModel().FromEntity<OrderViewModel>(order, o =>
            {
                o.Customer = new CustomerViewModel().FromEntity<CustomerViewModel>(_customerRepo.Find(o.CustomerId));
                o.Logs = _orderLogRepo.Get(l => l.OrderNo == o.OrderNo).OrderByDescending(ol=>ol.CreateDate).ToList().Select(l => new OrderLogViewModel().FromEntity<OrderLogViewModel>(l));
                o.Items = _orderRepo.Context.Set<OrderItemEntity>().Where(oi => oi.OrderNo == o.OrderNo && oi.Status != (int)DataStatus.Deleted)
                        .ToList()
                        .Select(oi => new OrderItemViewModel().FromEntity<OrderItemViewModel>(oi, item =>
                        {
                            item.ProductResource = new ResourceViewModel().FromEntity<ResourceViewModel>(Context.Set<ResourceEntity>().Where(r => r.SourceId == item.ProductId
                                        && r.SourceType == (int)SourceType.Product
                                        && r.Status != (int)DataStatus.Deleted).OrderByDescending(r => r.SortOrder).OrderBy(r => r.CreatedDate).FirstOrDefault());
                            item.Brand = new BrandViewModel().FromEntity<BrandViewModel>(Context.Set<BrandEntity>().Find(item.BrandId));
                        }));
                o.ShippingViaMethod = _orderRepo.Context.Set<ShipViaEntity>().Where(s => s.Id == o.ShippingVia).FirstOrDefault();
                o.RMAs = _rmaRepo.Get(r => r.OrderNo == o.OrderNo)
                         .GroupJoin(_rmaitemRepo.GetAll(), ou => ou.RMANo, i => i.RMANo, (ou, i) => new { R = ou, RI = i.FirstOrDefault() })
                         .OrderByDescending(r=>r.R.CreateDate)
                         .ToList()
                         .Select(r => new RMAViewModel().FromEntity<RMAViewModel>(r.R, rm => {
                             rm.Item = new RMAItemViewModel().FromEntity<RMAItemViewModel>(r.RI);
                         }));
                        

            });
            return View(model);
        }