Example #1
0
        public async Task <Result> List()
        {
            var user = await _workContext.GetCurrentOrThrowAsync();

            var list = await _productWishlistRepository.Query()
                       .Include(c => c.Product).ThenInclude(x => x.ThumbnailImage)
                       .Where(c => c.CustomerId == user.Id)
                       .OrderByDescending(c => c.UpdatedOn)
                       .Select(c => new GoodsListResult
            {
                Id                = c.Product.Id,
                Name              = c.Product.Name,
                Slug              = c.Product.Slug,
                Price             = c.Product.Price,
                OldPrice          = c.Product.OldPrice,
                SpecialPrice      = c.Product.SpecialPrice,
                SpecialPriceStart = c.Product.SpecialPriceStart,
                SpecialPriceEnd   = c.Product.SpecialPriceEnd,
                IsAllowToOrder    = c.Product.IsAllowToOrder,
                ThumbnailUrl      = c.Product.ThumbnailImage.Url,
                ReviewsCount      = c.Product.ReviewsCount,
                RatingAverage     = c.Product.RatingAverage,
                ShortDescription  = c.Product.ShortDescription,
                IsPublished       = c.Product.IsPublished,
                IsFeatured        = c.Product.IsFeatured
            }).ToListAsync();

            return(Result.Ok(list));
        }
Example #2
0
        public async Task <Result> Cancel(int id, [FromBody] OrderCancelParam reason)
        {
            var user = await _workContext.GetCurrentOrThrowAsync();

            var order = await _orderRepository.Query()
                        .FirstOrDefaultAsync(c => c.CustomerId == user.Id && c.Id == id);

            if (order == null)
            {
                return(Result.Fail("订单不存在"));
            }
            else if (order.OrderStatus == OrderStatus.Canceled)
            {
                return(Result.Fail("订单已取消"));
            }
            var orderSs = new OrderStatus[] { OrderStatus.New, OrderStatus.PendingPayment, OrderStatus.PaymentFailed };

            if (!orderSs.Contains(order.OrderStatus))
            {
                return(Result.Fail("当前订单无法取消"));;
            }
            await _orderService.Cancel(id, user.Id, reason?.Reason);

            return(Result.Ok());
        }
        public async Task <Result> Put(int id, [FromBody] AdminReviewUpdateParam param)
        {
            var user = await _workContext.GetCurrentOrThrowAsync();

            var model = await _reviewRepository.FirstOrDefaultAsync(id);

            if (model != null)
            {
                model.Status    = param.Status;
                model.UpdatedOn = DateTime.Now;
                await _reviewRepository.SaveChangesAsync();
            }
            return(Result.Ok());
        }
Example #4
0
        public async Task <OrderCreateResult> OrderCrateByCart2(int cartId, OrderCreateBaseParam param, string adminNote = null)
        {
            if (param == null)
            {
                throw new Exception("参数异常");
            }

            var user = await _workContext.GetCurrentOrThrowAsync();

            var customerId = param.CustomerId;
            var cart       = await _cartRepository.Query()
                             .Include(c => c.Items)
                             .FirstOrDefaultAsync(x => x.CustomerId == customerId && x.IsActive && x.Id == cartId);

            if (cart == null || cart.Items == null || cart.Items.Where(c => c.IsChecked).Count() <= 0)
            {
                throw new Exception("请选择商品");
            }
            if (cart.Items.Where(c => c.IsChecked).Any(c => c.Quantity <= 0))
            {
                throw new Exception("商品数量必须大于0");
            }
            param.Items = cart.Items.Where(c => c.IsChecked).Select(c => new OrderCreateBaseItemParam()
            {
                ProductId = c.ProductId,
                Quantity  = c.Quantity
            }).ToList();

            var order = await this.OrderCreate(user.Id, param, adminNote);

            // 清除已下单的商品
            foreach (var item in cart.Items.Where(c => c.IsChecked))
            {
                if (order.OrderItems.Any(c => c.ProductId == item.ProductId))
                {
                    item.IsDeleted = true;
                    item.UpdatedOn = DateTime.Now;
                }
            }

            await _cartRepository.SaveChangesAsync();

            return(new OrderCreateResult()
            {
                OrderId = order.Id,
                OrderNo = order.No.ToString(),
                OrderTotal = order.OrderTotal
            });
        }
Example #5
0
        public async Task <Result> AdminPayment(int id)
        {
            var currentUser = await _workContext.GetCurrentOrThrowAsync();

            var order = await _orderRepository.Query().Where(c => c.Id == id).FirstOrDefaultAsync();

            if (order == null)
            {
                return(Result.Fail("订单不存在"));
            }

            var orderSs = new OrderStatus[] { OrderStatus.New, OrderStatus.PendingPayment, OrderStatus.PaymentFailed };

            if (!orderSs.Contains(order.OrderStatus))
            {
                return(Result.Fail("当前订单状态不允许标记付款"));
            }

            await _orderService.PaymentReceived(new PaymentReceivedParam()
            {
                OrderId = order.Id,
                Note    = "标记付款"
            });

            return(Result.Ok());
        }
Example #6
0
        public async Task <Result> List(int take = 20)
        {
            var user = await _workContext.GetCurrentOrThrowAsync();

            var list = await _productRecentlyViewedRepository.Query()
                       .Where(c => c.CustomerId == user.Id)
                       .Include(c => c.Product).ThenInclude(x => x.ThumbnailImage)
                       .OrderByDescending(c => c.LatestViewedOn)
                       .Take(take)
                       .Select(x => new GoodsListByRecentlyViewedResult
            {
                Id                = x.Product.Id,
                Name              = x.Product.Name,
                Slug              = x.Product.Slug,
                Price             = x.Product.Price,
                OldPrice          = x.Product.OldPrice,
                SpecialPrice      = x.Product.SpecialPrice,
                SpecialPriceStart = x.Product.SpecialPriceStart,
                SpecialPriceEnd   = x.Product.SpecialPriceEnd,
                IsAllowToOrder    = x.Product.IsAllowToOrder,
                ThumbnailUrl      = x.Product.ThumbnailImage.Url,
                ReviewsCount      = x.Product.ReviewsCount,
                RatingAverage     = x.Product.RatingAverage,
                ShortDescription  = x.Product.ShortDescription,
                IsPublished       = x.Product.IsPublished,
                LatestViewedOn    = x.LatestViewedOn,
                IsFeatured        = x.Product.IsFeatured
            })
                       .ToListAsync();

            var result = new List <GoodsListByRecentlyViewedGroupRessult>();
            var keys   = list.GroupBy(c => c.LatestViewedOn.ToString("yyyy-MM-dd")).Select(c => c.Key).OrderByDescending(c => c);

            foreach (var key in keys)
            {
                result.Add(new GoodsListByRecentlyViewedGroupRessult()
                {
                    LatestViewedOnForDay = key,
                    Items = list.Where(c => c.LatestViewedOn.ToString("yyyy-MM-dd") == key).ToList()
                });
            }
            return(Result.Ok(result));
        }
Example #7
0
        public async Task <Result> Post([FromBody] ReplyAddParam param)
        {
            var user = await _workContext.GetCurrentOrThrowAsync();

            var reply = new Reply
            {
                ReviewId    = param.ReviewId,
                Comment     = param.Comment,
                IsAnonymous = param.IsAnonymous,
                ParentId    = null,
                UserId      = user.Id,
                ReplierName = param.IsAnonymous ? $"{user.FullName.First()}***{user.FullName.Last()}" : user.FullName,
            };

            if (param.ToReplyId != null)
            {
                var toReply = await _replyRepository.FirstOrDefaultAsync(param.ToReplyId.Value);

                if (toReply == null)
                {
                    throw new Exception("回复信息不存在");
                }
                reply.ToUserId   = toReply.UserId;
                reply.ToUserName = toReply.ReplierName;
                reply.ParentId   = toReply.ParentId ?? toReply.Id;
            }
            _replyRepository.Add(reply);
            await _replyRepository.SaveChangesAsync();

            var isAuto = await _appSettingService.Get <bool>(ReviewKeys.IsReplyAutoApproved);

            if (isAuto)
            {
                await _mqService.Send(QueueKeys.ReplyAutoApproved, new ReplyAutoApprovedEvent()
                {
                    ReplyId = reply.Id
                });
            }
            return(Result.Ok());
        }
        public async Task <Result> Put([FromBody] AppSetting model)
        {
            // 由于涉及高级权限,影响系统运行,目前暂时控制系统用户才可以修改
            // TODO 待优化
            var user = await _workContext.GetCurrentOrThrowAsync();

            if (user.Id != (int)UserWithId.System)
            {
                return(Result.Fail("您不是系统管理员!您没有操作权限"));
            }

            var setting = await _appSettingRepository.Query().FirstOrDefaultAsync(x => x.Id == model.Id && x.IsVisibleInCommonSettingPage);

            if (setting != null)
            {
                if (setting.FormatType == AppSettingFormatType.Json)
                {
                    var type = Type.GetType(setting.Type);
                    if (type == null)
                    {
                        return(Result.Fail("设置类型异常"));
                    }
                    var obj = JsonConvert.DeserializeObject(model.Value, type);
                    if (obj == null)
                    {
                        return(Result.Fail("设置参数异常"));
                    }
                }

                setting.Value = model.Value;
                var count = await _appSettingRepository.SaveChangesAsync();

                if (count > 0)
                {
                    await _appSettingService.ClearCache(setting.Id);

                    _configurationRoot.Reload();

                    //if (setting.FormatType == AppSettingFormatType.Json)
                    //{
                    //    // 绑定方式
                    //    // Singleton/Option
                    //    // 是否可以重新注入绑定??
                    //    var type = Type.GetType(setting.Type);
                    //    if (type == null)
                    //    {
                    //        return Result.Fail("配置类型异常");
                    //    }
                    //    //var obj = type.Assembly.CreateInstance(type.FullName);
                    //    var obj = Activator.CreateInstance(type);
                    //    //var pis = type.GetType().GetProperties();
                    //    //foreach (var pi in pis)
                    //    //{
                    //    //    obj.GetType().GetField(pi.Name).SetValue(obj, objVal[pi.Name]);
                    //    //}
                    //    return Result.Ok();
                    //}
                }
            }
            return(Result.Ok());
        }
        public async Task <Result> Support([FromBody] SupportParam param)
        {
            var user = await _workContext.GetCurrentOrThrowAsync();

            var any = supportEntityTypeIds.Any(c => c == param.EntityTypeId);

            if (!any)
            {
                throw new Exception("参数不支持");
            }

            var model = await _supportRepository
                        .Query(c => c.UserId == user.Id && c.EntityId == param.EntityId && c.EntityTypeId == (int)param.EntityTypeId)
                        .FirstOrDefaultAsync();

            if (model == null)
            {
                model = new Support()
                {
                    UserId       = user.Id,
                    EntityId     = param.EntityId,
                    EntityTypeId = (int)param.EntityTypeId
                };
                _supportRepository.Add(model);
            }
            else
            {
                model.IsDeleted = true;
                model.UpdatedOn = DateTime.Now;
            }

            var supportCount = 0;

            switch (param.EntityTypeId)
            {
            case EntityTypeWithId.Review:
            {
                var review = await _reviewRepository.FirstOrDefaultAsync(param.EntityId);

                if (review == null)
                {
                    throw new Exception("评论信息不存在");
                }
                review.SupportCount += model.IsDeleted ? -1 : 1;
                review.UpdatedOn     = DateTime.Now;
                supportCount         = review.SupportCount;
            }
            break;

            case EntityTypeWithId.Reply:
            {
                var reply = await _replyRepository.FirstOrDefaultAsync(param.EntityId);

                if (reply == null)
                {
                    throw new Exception("评论信息不存在");
                }
                reply.SupportCount += model.IsDeleted ? -1 : 1;
                reply.UpdatedOn     = DateTime.Now;
                supportCount        = reply.SupportCount;
            }
            break;

            default:
                throw new Exception("参数不支持");
            }

            using (var tran = _supportRepository.BeginTransaction())
            {
                await _reviewRepository.SaveChangesAsync();

                await _replyRepository.SaveChangesAsync();

                await _supportRepository.SaveChangesAsync();

                tran.Commit();
            }
            return(Result.Ok(supportCount));
        }
Example #10
0
        public async Task <Result> AddReview([FromBody] ReviewAddParam param)
        {
            var user = await _workContext.GetCurrentOrThrowAsync();

            var anyType = entityTypeIds.Any(c => c == param.EntityTypeId);

            if (!anyType)
            {
                throw new Exception("参数异常");
            }

            if (param.SourceType == null && param.SourceId != null)
            {
                throw new Exception("评论来源类型异常");
            }
            else if (param.SourceType != null && param.SourceId != null)
            {
                if (param.SourceType == ReviewSourceType.Order && param.EntityTypeId == EntityTypeWithId.Product)
                {
                    var anyProduct = _orderRepository.Query().Any(c => c.Id == param.SourceId.Value && c.OrderItems.Any(x => x.ProductId == param.EntityId));
                    if (!anyProduct)
                    {
                        throw new Exception("评论商品不存在");
                    }
                    var order = await _orderRepository.Query().FirstOrDefaultAsync(c => c.Id == param.SourceId);

                    if (order == null)
                    {
                        throw new Exception("订单不存在");
                    }
                    if (order.OrderStatus != OrderStatus.Complete)
                    {
                        throw new Exception("订单未完成,无法进行评价");
                    }
                }
            }

            // 一个用户
            // 评论 某订单 某商品只能一次
            // 评论 无订单关联 评论商品只能一次
            var any = await _reviewRepository.Query()
                      .AnyAsync(c => c.UserId == user.Id && c.EntityTypeId == (int)param.EntityTypeId && c.EntityId == param.EntityId && c.SourceId == param.SourceId && c.SourceType == param.SourceType);

            if (any)
            {
                throw new Exception("您已评论");
            }

            var review = new Review
            {
                Rating       = param.Rating,
                Title        = param.Title,
                Comment      = param.Comment,
                EntityId     = param.EntityId,
                EntityTypeId = (int)param.EntityTypeId,
                IsAnonymous  = param.IsAnonymous,
                UserId       = user.Id,
                ReviewerName = param.IsAnonymous ? $"{user.FullName.First()}***{user.FullName.Last()}" : user.FullName,
                SourceId     = param.SourceId,
                SourceType   = param.SourceType
            };

            if (param?.MediaIds.Count > 0)
            {
                var mediaIds = param.MediaIds.Distinct();
                int i        = 0;
                foreach (var mediaId in mediaIds)
                {
                    review.Medias.Add(new ReviewMedia()
                    {
                        DisplayOrder = i,
                        MediaId      = mediaId,
                        Review       = review
                    });
                    i++;
                }
            }
            _reviewRepository.Add(review);
            _reviewRepository.SaveChanges();

            var isAuto = await _appSettingService.Get <bool>(ReviewKeys.IsReviewAutoApproved);

            if (isAuto)
            {
                await _mqService.DirectSend(QueueKeys.ReviewAutoApproved, new ReviewAutoApprovedEvent()
                {
                    ReviewId = review.Id
                });
            }
            return(Result.Ok());
        }