Пример #1
0
        public async Task <Result> ConfirmApply([FromBody] AdminRefundConfirmApplyRequest request)
        {
            var returnApply = await _returnApplyRepository.Query()
                              .Include(e => e.OrderItem)
                              .FirstOrDefaultAsync(e => e.Id == request.Id);

            if (returnApply == null)
            {
                return(Result.Fail(ResultCodes.IdInvalid));
            }
            if (returnApply.Status != ReturnAuditStatus.NotAudit)
            {
                return(Result.Fail(ResultCodes.RequestParamError, "当前申请不允许修改状态"));
            }

            var address = await _addressRepository.Query()
                          .Include(e => e.Province)
                          .Include(e => e.City)
                          .Include(e => e.Area)
                          .FirstOrDefaultAsync(e => e.Id == request.RefundAddressId);

            if (address == null)
            {
                return(Result.Fail(ResultCodes.RequestParamError, "无效地址"));
            }

            var returnAddress = new ReturnAddress
            {
                ReturnApplyId = returnApply.Id,
                AreaName      = address.Area.Name,
                CityName      = address.City.Name,
                Createat      = DateTime.Now,
                DetailInfo    = address.DetailInfo,
                PostalCode    = address.PostalCode.ToString(),
                ProvinceName  = address.Province.Name,
                Remarks       = request.Remarks,
                TelNumber     = address.TelNumber,
                UserName      = address.UserName,
            };

            returnApply.Status           = ReturnAuditStatus.Agree;
            returnApply.AuditMessage     = request.Remarks;
            returnApply.AuditTime        = DateTime.Now;
            returnApply.OrderItem.Status = OrderItemStatus.ConfirmApply;

            _returnApplyRepository.Update(returnApply, false);
            using (var transaction = _returnApplyRepository.BeginTransaction())
            {
                await _returnApplyRepository.SaveAsync();

                await _refundAddressRepository.InsertAsync(returnAddress);

                transaction.Commit();
            }

            return(Result.Ok());
        }
Пример #2
0
        public async Task <Result> Cancel([FromBody] AdminWithdrawalCancelRequest request)
        {
            var apply = await _withdrawalHistoryRepository.FirstOrDefaultAsync(request.Id);

            if (apply == null)
            {
                return(Result.Fail(ResultCodes.IdInvalid));
            }
            if (apply.Status != WithdrawalStatus.Apply)
            {
                return(Result.Fail(ResultCodes.RequestParamError, "当前申请状态不允许确认"));
            }

            apply.Status      = WithdrawalStatus.Failed;
            apply.Description = request.Message;
            apply.Message     = request.Message;

            _withdrawalHistoryRepository.Update(apply, false);

            using (var transaction = _withdrawalHistoryRepository.BeginTransaction())
            {
                await _withdrawalHistoryRepository.SaveAsync();

                await _customerManager.UpdateAssets(apply.CustomerId, 0, apply.Total, -apply.ReservedAmount, "提现失败返回金额");

                transaction.Commit();
            }

            return(Result.Ok());
        }
Пример #3
0
        /// <summary>
        /// 处理
        /// </summary>
        /// <param name="notification"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public async Task Handle(CustomerRelationEvent notification, CancellationToken cancellationToken)
        {
            if (notification.ParentId == notification.ChildrenId)
            {
                return;
            }
            try
            {
                var customerRelations = new List <CustomerRelation>()
                {
                    new CustomerRelation(notification.ParentId, notification.ChildrenId, 1)
                };

                var relations = await _customerRelationRepository.Query().Where(e => e.ChildrenId == notification.ParentId).ToListAsync();

                if (relations.Count > 0)
                {
                    foreach (var item in relations)
                    {
                        customerRelations.Add(new CustomerRelation(item.ParentId, notification.ChildrenId, item.Level + 1));
                    }
                }

                using (var transaction = _customerRelationRepository.BeginTransaction())
                {
                    foreach (var item in customerRelations)
                    {
                        _customerRelationRepository.Insert(item, false);
                    }

                    await _customerRelationRepository.SaveAsync();

                    transaction.Commit();
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex.Message, ex);
            }
        }
Пример #4
0
        /// <summary>
        /// 确认收货
        /// </summary>
        /// <param name="shipmentId"></param>
        /// <returns></returns>
        public async Task <Result> Confirm(int shipmentId)
        {
            var shipment = await _shipmentRepository.Query()
                           .Include(e => e.ShipmentOrderItems).ThenInclude(e => e.OrderItem).ThenInclude(e => e.CommissionHistory)
                           .FirstOrDefaultAsync(e => e.Id == shipmentId);

            if (shipment == null)
            {
                return(Result.Fail(ResultCodes.IdInvalid));
            }

            if (shipment.ShippingStatus == ShippingStatus.Complete)
            {
                return(Result.Fail(ResultCodes.RequestParamError, "当前订单已完成确认收货"));
            }
            if (shipment.ShippingStatus != ShippingStatus.Shipped)
            {
                return(Result.Fail(ResultCodes.RequestParamError, "当前订单状态不允许确认收货"));
            }

            shipment.ShippingStatus = ShippingStatus.Complete;
            shipment.CompleteTime   = DateTime.Now;

            var orderItems      = shipment.ShipmentOrderItems.Select(e => e.OrderItem);
            var totalCommission = 0;
            var states          = new[] { OrderItemStatus.ApplyFaild, OrderItemStatus.Shipped };

            foreach (var item in orderItems)
            {
                if (!states.Contains(item.Status))
                {
                    continue;
                }
                item.Status           = OrderItemStatus.Complete;
                item.CompleteTime     = DateTime.Now;
                item.WarrantyDeadline = DateTime.Now.AddYears(1);

                if (item.CommissionHistory != null)
                {
                    item.CommissionHistory.Status = CommissionStatus.Complete;
                    totalCommission += item.CommissionHistory.Commission;
                }
            }

            _shipmentRepository.Update(shipment, false);

            using (var transaction = _shipmentRepository.BeginTransaction())
            {
                await _shipmentRepository.SaveAsync();

                if (totalCommission > 0)
                {
                    var parentUser = await _customerRelationRepository.Query().FirstOrDefaultAsync(e => e.ChildrenId == shipment.CustomerId && e.Level == 1);

                    if (parentUser != null)
                    {
                        await _customerManager.UpdateAssets(parentUser.ParentId, -totalCommission, totalCommission, "返佣金");
                    }
                }

                transaction.Commit();
            }

            return(Result.Ok());
        }
Пример #5
0
        public async Task <Result> Create([FromBody] AdminGoodsCreateRequest request)
        {
            var goodsMedias = new List <GoodsMedia>();

            if (request.GoodsMediaIds != null && request.GoodsMediaIds.Count > 0)
            {
                foreach (var mediaId in request.GoodsMediaIds)
                {
                    goodsMedias.Add(new GoodsMedia(mediaId));
                }
            }
            var goods = new Goods
            {
                Name             = request.Name,
                Description      = request.Description,
                Price            = request.Price,
                ThumbnailImageId = request.ThumbnailImageId,
                IsPublished      = request.IsPublished,
                HasOptions       = true,
                IsVisible        = false,
                BranchDiscount   = request.BranchDiscount,
                CityDiscount     = request.CityDiscount,
                DisplayOrder     = request.DisplayOrder,
                GoodsMedias      = goodsMedias,
                Createat         = DateTime.Now
            };

            if (request.IsPublished)
            {
                goods.PublishedOn = DateTime.Now;
            }

            List <GoodsOptionValue> goodsOptionValues = new List <GoodsOptionValue>();

            foreach (var option in request.Options.Distinct())
            {
                foreach (var item in option.Values.Distinct())
                {
                    goodsOptionValues.Add(new GoodsOptionValue(option.Id, item.Value, item.DisplayOrder));
                }
            }
            goods.OptionValues = goodsOptionValues;

            List <Goods> childrens  = new List <Goods>();
            var          variations = request.Variations.Distinct();

            foreach (var variation in variations)
            {
                var optionCombinations = new List <GoodsOptionCombination>();
                var coms = variation.OptionCombinations.Distinct();
                foreach (var combination in coms)
                {
                    if (!goods.OptionValues.Any(c => c.OptionId == combination.OptionId))
                    {
                        return(Result.Fail(ResultCodes.RequestParamError, "商品组合中的选项不存在"));
                    }
                    if (!goods.OptionValues.Any(c => c.Value == combination.Value))
                    {
                        return(Result.Fail(ResultCodes.RequestParamError, "商品组合中的选项值不存在"));
                    }
                    if (optionCombinations.Any(c => c.OptionId == combination.OptionId && c.Value == combination.Value))
                    {
                        continue;
                    }

                    optionCombinations.Add(new GoodsOptionCombination(combination.OptionId, combination.DisplayOrder, combination.Value));
                }
                var child = new Goods
                {
                    Name               = goods.Name + variation.NormalizedName,
                    NormalizedName     = variation.NormalizedName,
                    Price              = variation.Price,
                    HasOptions         = false,
                    IsVisible          = true,
                    StockQuantity      = variation.StockQuantity,
                    Createat           = DateTime.Now,
                    OptionCombinations = optionCombinations
                };
                if (request.IsPublished)
                {
                    child.IsPublished = true;
                    child.PublishedOn = DateTime.Now;
                }
                childrens.Add(child);
            }
            goods.Childrens = childrens;

            _goodsRepository.Insert(goods, false);

            using (var transaction = _goodsRepository.BeginTransaction())
            {
                await _goodsRepository.SaveAsync();

                transaction.Commit();
            }

            return(Result.Ok());
        }
Пример #6
0
        public async Task <Result> Create(AdminOrderCreateRequest request)
        {
            var customer = await _customerRepository.Query()
                           .Include(e => e.Parent)
                           .FirstOrDefaultAsync(e => e.Id == request.CustomerId);

            if (customer == null)
            {
                return(Result.Fail(ResultCodes.IdInvalid));
            }
            if (customer.Role == PartnerRole.Default && request.PartnerRole == PartnerRole.Default)
            {
                return(Result.Fail(ResultCodes.RequestParamError, "请选择合伙人角色"));
            }
            if (customer.Role != PartnerRole.Default && request.Goods.Count == 0)
            {
                return(Result.Fail(ResultCodes.RequestParamError, "请选择商品"));
            }

            var now             = DateTime.Now;
            var isFirstOrder    = false;
            var totalFee        = 0;
            var actuallyAmount  = 0;
            var extendParams    = string.Empty;
            var totalCommission = 0;
            var commissionRatio = 0f;
            var orderItems      = new List <OrderItem>();
            var parentUser      = customer.Parent;

            if (request.PartnerRole != PartnerRole.Default)
            {
                if (customer.Role != PartnerRole.Default)
                {
                    return(Result.Fail(ResultCodes.RequestParamError, $"用户:{customer.NickName} 为{customer.Role.GetDescription()} 不能重复设置角色"));
                }
                var partner = await _partnerApplyRepository.Query()
                              .Include(e => e.PartnerApplyGoods).ThenInclude(e => e.Goods).ThenInclude(e => e.ThumbnailImage)
                              .Where(e => e.PartnerRole == request.PartnerRole)
                              .FirstOrDefaultAsync();

                if (partner == null)
                {
                    return(Result.Fail(ResultCodes.RequestParamError, $"角色{request.PartnerRole.GetDescription()}未设置商品"));
                }
                if (partner.PartnerApplyGoods.Count == 0)
                {
                    return(Result.Fail(ResultCodes.RequestParamError, "没有商品"));
                }

                if (parentUser != null)
                {
                    if (parentUser.Role == partner.PartnerRole)
                    {
                        if (partner.ReferralCommissionRatio > 0)
                        {
                            commissionRatio = partner.ReferralCommissionRatio / 100f;
                        }
                    }
                    else
                    {
                        var ratio = await _partnerApplyRepository.Query()
                                    .Where(e => e.PartnerRole == parentUser.Role)
                                    .Select(e => e.RepurchaseCommissionRatio)
                                    .FirstOrDefaultAsync();

                        if (ratio > 0)
                        {
                            commissionRatio = ratio / 100f;
                        }
                    }
                }

                isFirstOrder   = true;
                customer.Role  = request.PartnerRole;
                extendParams   = Enum.GetName(typeof(PartnerRole), request.PartnerRole);
                totalFee       = partner.OriginalPrice == 0 ? partner.TotalAmount : partner.OriginalPrice;
                actuallyAmount = partner.TotalAmount;
                var goodsQuantity = partner.PartnerApplyGoods.Sum(e => e.Quantity);
                var averagePrice  = partner.TotalAmount / goodsQuantity;
                var quantity      = 0;
                foreach (var item in partner.PartnerApplyGoods)
                {
                    quantity += item.Quantity;
                    if (quantity == goodsQuantity)
                    {
                        averagePrice = partner.TotalAmount - ((quantity - 1) * averagePrice);
                    }
                    var commission = (int)(averagePrice * commissionRatio);
                    totalCommission = item.Quantity * commission;
                    for (int i = 0; i < item.Quantity; i++)
                    {
                        var orderItem = new OrderItem
                        {
                            GoodsId           = item.GoodsId,
                            GoodsName         = item.Goods.Name,
                            GoodsPrice        = item.Goods.Price,
                            DiscountAmount    = item.Goods.Price,
                            GoodsMediaUrl     = item.Goods.ThumbnailImage?.Url,
                            Quantity          = 1,
                            Remarks           = string.Empty,
                            Status            = OrderItemStatus.Default,
                            Createat          = now,
                            IsFirstBatchGoods = true
                        };

                        orderItem.SetCommissionHistory(customer.ParentId, commission, (int)(commissionRatio * 100), CommissionStatus.Complete);

                        orderItems.Add(orderItem);
                    }
                }
            }
            else if (request.Goods.Count > 0)
            {
                if (customer.Role == PartnerRole.Default)
                {
                    return(Result.Fail(ResultCodes.RequestParamError, $"用户:{customer.NickName} 为未设置合伙人角色"));
                }
                if (parentUser != null)
                {
                    var ratio = await _partnerApplyRepository.Query()
                                .Where(e => e.PartnerRole == parentUser.Role)
                                .Select(e => e.RepurchaseCommissionRatio)
                                .FirstOrDefaultAsync();

                    if (ratio > 0)
                    {
                        commissionRatio = ratio / 100f;
                    }
                }
                var goodsIds = request.Goods.Select(e => e.Id).Distinct();
                var goodses  = await _goodsRepository.Query()
                               .Include(e => e.ThumbnailImage)
                               .Where(e => goodsIds.Contains(e.Id))
                               .ToListAsync();

                foreach (var item in goodses)
                {
                    var first = request.Goods.FirstOrDefault(e => e.Id == item.Id);
                    if (first == null)
                    {
                        return(Result.Fail(ResultCodes.RequestParamError, $"产品{item.Name}不存在"));
                    }
                    if (!item.IsPublished)
                    {
                        return(Result.Fail(ResultCodes.RequestParamError, $"产品{item.Name}未发布"));
                    }

                    var discountRate = 100f;
                    if (customer.Role == PartnerRole.CityPartner && item.CityDiscount > 0)
                    {
                        discountRate = item.CityDiscount;
                    }
                    else if (customer.Role == PartnerRole.BranchPartner && item.BranchDiscount > 0)
                    {
                        discountRate = item.BranchDiscount;
                    }

                    var amount     = (int)(item.Price * (discountRate / 100f));
                    var commission = (int)(amount * commissionRatio);
                    totalCommission += first.Quantity * commission;

                    for (int i = 0; i < first.Quantity; i++)
                    {
                        var orderItem = new OrderItem
                        {
                            GoodsId        = item.Id,
                            GoodsName      = item.Name,
                            GoodsPrice     = item.Price,
                            DiscountAmount = amount, //折扣
                            GoodsMediaUrl  = item.ThumbnailImage?.Url,
                            Quantity       = 1,
                            Remarks        = first.Remarks,
                            Status         = OrderItemStatus.Default,
                            Createat       = now,
                        };

                        orderItem.SetCommissionHistory(customer.ParentId, commission, (int)(commissionRatio * 100), CommissionStatus.PendingSettlement);

                        orderItems.Add(orderItem);
                    }
                }
                totalFee       = orderItems.Sum(e => e.Quantity * e.GoodsPrice);
                actuallyAmount = orderItems.Sum(e => e.Quantity * e.DiscountAmount);
            }

            var order = new Orders(GenerateHelper.GenOrderNo())
            {
                CustomerId     = customer.Id,
                OrderStatus    = OrderStatus.PaymentReceived,
                PaymentType    = request.PaymentType,
                PaymentMethod  = request.PaymentMethod,
                PaymentFee     = actuallyAmount,
                PaymentTime    = now,
                Remarks        = request.Remarks,
                Createat       = now,
                TotalFee       = totalFee,
                ActuallyAmount = actuallyAmount,
                ExtendParams   = extendParams,
                IsFirstOrder   = isFirstOrder,
                OrderItems     = orderItems
            };

            _orderRepository.Insert(order, false);

            using (var transaction = _orderRepository.BeginTransaction())
            {
                await _orderRepository.SaveAsync();

                if (parentUser != null && totalCommission > 0)
                {
                    if (isFirstOrder)
                    {
                        await _customerManager.UpdateAssets(parentUser.Id, 0, totalCommission, "下级首单返佣金");
                    }
                    else
                    {
                        await _customerManager.UpdateCommission(parentUser.Id, totalCommission);
                    }
                }

                if (isFirstOrder)
                {
                    await _customerRepository.UpdateAsync(customer);
                }

                transaction.Commit();
            }

            return(Result.Ok());
        }
Пример #7
0
        public async Task <Result> PayBank([FromBody] WithdrawalPayBankRequest request)
        {
            var userId   = HttpContext.GetUserId();
            var bankCard = await _bankCardRepository.FirstOrDefaultAsync(request.Id);

            // var user = await _customerRepository.Query().Include(e => e.Assets).FirstOrDefaultAsync(e => e.Id == userId);
            var assets = await _assetsRepository.Query().FirstOrDefaultAsync(e => e.CustomerId == userId);

            if (assets == null)
            {
                return(Result.Fail(ResultCodes.RequestParamError, "可提现金额不足"));
            }
            if (assets.AvailableAmount <= 0)
            {
                return(Result.Fail(ResultCodes.RequestParamError, "可提现金额不足"));
            }
            if (assets.AvailableAmount < request.Amount)
            {
                return(Result.Fail(ResultCodes.RequestParamError, "金额不足"));
            }
            if (request.Amount < 100000)
            {
                return(Result.Fail(ResultCodes.RequestParamError, "金额不足1000,不可提现"));
            }

            var reservedAmount = (int)(request.Amount * 0.2);     //保留20%的金额
            var amount         = request.Amount - reservedAmount; //提现金额
            var handlingFee    = (int)(request.Amount * 0.001);   //微信手续费0.1%

            if (handlingFee < 100)
            {
                handlingFee = 100;
            }
            else if (handlingFee > 2500)
            {
                handlingFee = 2500;
            }

            string partnerTradeNo = DateTime.Now.ToString("yyyyMMdd") + GenerateHelper.GenOrderNo();

            var payBankRequest = new PayBankRequest
            {
                PartnerTradeNo = partnerTradeNo,
                Amount         = request.Amount,
                BankCode       = bankCard.BankCode,
                BankNo         = bankCard.BankNo,
                Desc           = "提现",
                TrueName       = bankCard.Name
            };

            var payBankResult = await _paymentService.PayBank(payBankRequest);

            var withdrawalHistory = new WithdrawalHistory
            {
                CustomerId     = bankCard.CustomerId,
                Name           = bankCard.Name,
                BankCode       = bankCard.BankCode,
                BankNo         = bankCard.BankNo,
                Amount         = amount,
                ReservedAmount = reservedAmount - reservedAmount,
                Status         = payBankResult.IsSuccess ? WithdrawalStatus.Success : WithdrawalStatus.Failed,
                Message        = payBankResult.Message,
                PartnerTradeNo = partnerTradeNo,
                Total          = request.Amount,
                HandlingFee    = handlingFee,
                Createat       = DateTime.Now
            };

            _withdrawalHistoryRepository.Insert(withdrawalHistory, false);

            using (var transaction = _withdrawalHistoryRepository.BeginTransaction())
            {
                await _withdrawalHistoryRepository.SaveAsync();

                if (payBankResult.IsSuccess)
                {
                    await _customerManager.UpdateAssets(assets, -request.Amount, reservedAmount - reservedAmount, "提现");
                }
                transaction.Commit();
            }

            return(Result.Ok(payBankResult));
        }
Пример #8
0
        public async Task <Result> Apply([FromBody] ShipmentApplyRequest request)
        {
            var userId = HttpContext.GetUserId();

            ShippingAddress shippingAddress = null;

            if (request.ShippingAddressId > 0)
            {
                var address = await _customerAddressRepository.Query()
                              .Include(e => e.Province)
                              .Include(e => e.City)
                              .Include(e => e.Area)
                              .FirstOrDefaultAsync(e => e.Id == request.ShippingAddressId);

                if (address == null)
                {
                    return(Result.Fail(ResultCodes.RequestParamError, "送货地址不存在"));
                }

                shippingAddress = new ShippingAddress
                {
                    PostalCode   = address.PostalCode.ToString(),
                    ProvinceName = address.Province.Name,
                    CityName     = address.City.Name,
                    AreaName     = address.Area.Name,
                    DetailInfo   = address.DetailInfo,
                    TelNumber    = address.TelNumber,
                    UserName     = address.UserName,
                    Createat     = DateTime.Now
                };
            }
            else if (request.ShippingAddress != null)
            {
                shippingAddress = new ShippingAddress
                {
                    PostalCode   = request.ShippingAddress.PostalCode,
                    ProvinceName = request.ShippingAddress.ProvinceName,
                    CityName     = request.ShippingAddress.CityName,
                    AreaName     = request.ShippingAddress.CountyName,
                    DetailInfo   = request.ShippingAddress.DetailInfo,
                    TelNumber    = request.ShippingAddress.TelNumber,
                    UserName     = request.ShippingAddress.UserName,
                    Createat     = DateTime.Now
                };
            }

            var orderItemIds = request.Items.Select(e => e.Id).Distinct().ToList();
            var orderItems   = await _orderItemRepository.Query().Where(e => orderItemIds.Contains(e.Id)).ToListAsync();

            // var goodsIds = request.Items.Select(e => e.GoodsId);
            // var goodses = await _goodsRepository.Query().Where(e => goodsIds.Contains(e.Id)).ToListAsync();
            var shipmentOrderItems = new List <ShipmentOrderItem>();

            foreach (var item in request.Items.Distinct())
            {
                var first = orderItems.FirstOrDefault(e => e.Id == item.Id);
                if (first == null)
                {
                    return(Result.Fail(ResultCodes.RequestParamError, $"订单不存在 {item.Id}"));
                }

                // var goods = goodses.FirstOrDefault(e => e.Id == item.GoodsId);
                // if (goods == null) return Result.Fail(ResultCodes.RequestParamError, "商品不存在");
                // if (goods.ParentId == null) return Result.Fail(ResultCodes.RequestParamError, "选择的商品不是有效的商品");
                // if (goods.StockQuantity <= 0) return Result.Fail(ResultCodes.RequestParamError, $"商品{goods.Name} {goods.NormalizedName} 库存不足");
                // //减库存
                // goods.StockQuantity -= first.Quantity;

                first.GoodsItemId    = item.GoodsId;
                first.NormalizedName = item.NormalizedName;
                // first.ShippingStatus = ShippingStatus.PendingShipment;
                // first.ShippingTime = DateTime.Now;

                shipmentOrderItems.Add(new ShipmentOrderItem(first.Id));
            }

            var shipment = new Shipment
            {
                CustomerId         = userId,
                Quantity           = orderItems.Count,
                ShippingStatus     = ShippingStatus.PendingShipment,
                ShippingTime       = DateTime.Now,
                Createat           = DateTime.Now,
                Remarks            = request.Remarks,
                ShippingAddress    = shippingAddress,
                ShipmentOrderItems = shipmentOrderItems
            };

            _shipmentRepository.Insert(shipment, false);

            using (var transaction = _shipmentRepository.BeginTransaction())
            {
                await _shipmentRepository.SaveAsync();

                // await _goodsRepository.UpdateRangeAsync(goodses);

                transaction.Commit();
            }

            await _orderItemRepository.UpdateRangeAsync(orderItems);

            return(Result.Ok(_mapper.Map <ShipmentResponse>(shipment)));
        }
Пример #9
0
        public async Task <Result> Apply(ReturnApplyRequest request)
        {
            var item = await _orderItemRepository.Query()
                       .Include(e => e.ShipmentOrderItems).ThenInclude(e => e.Shipment)
                       .Include(e => e.ReturnApply)
                       .FirstOrDefaultAsync(e => e.Id == request.Id);

            if (item == null)
            {
                return(Result.Fail(ResultCodes.IdInvalid));
            }
            if (item.IsFirstBatchGoods)
            {
                return(Result.Fail(ResultCodes.RequestParamError, "首批商品不允许退货"));
            }
            if (item.Status != OrderItemStatus.Shipped)
            {
                return(Result.Fail(ResultCodes.RequestParamError, "当前商品状态不允许退货"));
            }
            if (item.Status == OrderItemStatus.RefundApply)
            {
                return(Result.Fail(ResultCodes.RequestParamError, "当前商品已申请退货"));
            }

            var user = await _customerManager.GetUserAsync();

            if (item.ReturnApply == null)
            {
                var shipment = item.ShipmentOrderItems.Where(e => e.Shipment.IsValid).Select(e => e.Shipment).FirstOrDefault();
                item.ReturnApply = new ReturnApply
                {
                    CustomerId      = user.Id,
                    Createat        = DateTime.Now,
                    Reason          = request.Reason,
                    Description     = string.Empty,
                    LogisticsStatus = request.LogisticsStatus,
                    ReturnType      = request.ReturnType,
                    PaymentAmount   = item.DiscountAmount,
                    RefundAmount    = item.DiscountAmount,
                    Status          = ReturnAuditStatus.NotAudit,
                    ShipmentId      = shipment.Id
                };
            }
            else
            {
                var returnApply = item.ReturnApply;
                returnApply.Createat        = DateTime.Now;
                returnApply.Reason          = request.Reason;
                returnApply.LogisticsStatus = request.LogisticsStatus;
                returnApply.ReturnType      = request.ReturnType;
                returnApply.Status          = ReturnAuditStatus.NotAudit;
            }

            item.Status = OrderItemStatus.RefundApply;

            _orderItemRepository.Update(item, false);

            using (var transaction = _orderItemRepository.BeginTransaction())
            {
                await _orderItemRepository.SaveAsync();

                transaction.Commit();
            }

            await _adminUserManager.AccountingNotify(new ReturnNotify
            {
                UserName = user.NickName
            });

            return(Result.Ok());
        }
Пример #10
0
        public async Task <Result> Edit([FromBody] AdminPartnerApplyEditRequest request)
        {
            var partnerApply = await _partnerApplyRepository.Query()
                               .Include(e => e.PartnerApplyGoods)
                               .FirstOrDefaultAsync(e => e.Id == request.Id);

            if (partnerApply == null)
            {
                return(Result.Fail(ResultCodes.IdInvalid));
            }
            if (request.Goods == null || request.Goods.Count == 0)
            {
                return(Result.Fail(ResultCodes.RequestParamError, "请选择商品"));
            }
            if (request.TotalAmount == 0)
            {
                return(Result.Fail(ResultCodes.RequestParamError, "总金额不能为0"));
            }

            if (partnerApply.PartnerRole != request.PartnerRole)
            {
                var anyPartnerType = _partnerApplyRepository.Query().Any(e => e.Id != request.Id && e.PartnerRole == request.PartnerRole);
                return(Result.Fail(ResultCodes.RequestParamError, "当前合伙人类型已设置申请条件"));
            }

            partnerApply.ReferralCommissionRatio   = request.ReferralCommissionRatio;
            partnerApply.RepurchaseCommissionRatio = request.RepurchaseCommissionRatio;
            partnerApply.PartnerRole   = request.PartnerRole;
            partnerApply.ApplyType     = request.ApplyType;
            partnerApply.TotalQuantity = request.TotalQuantity;
            partnerApply.TotalAmount   = request.TotalAmount;
            partnerApply.OriginalPrice = request.OriginalPrice;

            var partnerApplyGoods = new List <PartnerApplyGoods>();

            foreach (var goods in request.Goods)
            {
                var first = partnerApply.PartnerApplyGoods.FirstOrDefault(e => e.GoodsId == goods.GoodsId);
                if (first == null)
                {
                    partnerApplyGoods.Add(new PartnerApplyGoods(goods.GoodsId, goods.Quantity, goods.Price));
                }
                else
                {
                    first.Quantity = goods.Quantity;
                    first.Price    = goods.Price;
                    partnerApplyGoods.Add(first);
                }
            }
            partnerApply.PartnerApplyGoods = partnerApplyGoods;

            _partnerApplyRepository.Update(partnerApply, false);

            using (var transaction = _partnerApplyRepository.BeginTransaction())
            {
                await _partnerApplyRepository.SaveAsync();

                transaction.Commit();
            }

            return(Result.Ok());
        }
Пример #11
0
        public async Task <Result> Create([FromBody] OrderCreateRequest request)
        {
            if (request == null)
            {
                return(Result.Fail(ResultCodes.RequestParamError));
            }
            if (request.Items == null || request.Items.Count <= 0)
            {
                return(Result.Fail(ResultCodes.RequestParamError, "请选择商品"));
            }
            if (request.Items.Any(c => c.Quantity <= 0))
            {
                return(Result.Fail(ResultCodes.RequestParamError, "购买商品数量必须大于0"));
            }

            DateTime?timeNull = null;
            Assets   assets   = null;
            var      user     = await _customerManager.GetUserAndParentAsync();

            var commissionRatio = 0f; //佣金百分比
            var totalCommission = 0;  //总佣金
            var extendParams    = string.Empty;

            if (user.Role != PartnerRole.Default)
            {
                var parentUser = user.Parent;
                if (parentUser != null)
                {
                    var ratio = await _partnerApplyRepository.Query()
                                .Where(e => e.PartnerRole == parentUser.Role)
                                .Select(e => e.RepurchaseCommissionRatio)
                                .FirstOrDefaultAsync();

                    if (ratio > 0)
                    {
                        commissionRatio = ratio / 100f;
                    }
                }
            }

            var goodsIds = request.Items.Select(c => c.Id).Distinct();
            var goods    = await _goodsRepository.Query()
                           .Include(e => e.ThumbnailImage)
                           .Where(e => goodsIds.Contains(e.Id)).ToListAsync();

            if (goods.Count <= 0)
            {
                return(Result.Fail(ResultCodes.RequestParamError, "商品不存在"));
            }

            var orderItems = new List <OrderItem>();

            foreach (var item in goods)
            {
                var first = request.Items.FirstOrDefault(e => e.Id == item.Id);
                if (first == null)
                {
                    return(Result.Fail(ResultCodes.RequestParamError, $"产品{item.Name}不存在"));
                }
                if (!item.IsPublished)
                {
                    return(Result.Fail(ResultCodes.RequestParamError, $"产品{item.Name}未发布"));
                }

                var discountRate = 100f;
                if (user.Role == PartnerRole.CityPartner && item.CityDiscount > 0)
                {
                    discountRate = item.CityDiscount;
                }
                else if (user.Role == PartnerRole.BranchPartner && item.BranchDiscount > 0)
                {
                    discountRate = item.BranchDiscount;
                }

                var amount     = (int)(item.Price * (discountRate / 100f));
                var commission = (int)(amount * commissionRatio);

                for (int i = 0; i < first.Quantity; i++)
                {
                    totalCommission += commission;

                    //创建订单时不选择商品选项,发货时在选择商品选项
                    var orderItem = new OrderItem
                    {
                        GoodsId        = item.Id,
                        GoodsName      = item.Name,
                        GoodsPrice     = item.Price,
                        DiscountAmount = amount, //折扣
                        GoodsMediaUrl  = item.ThumbnailImage?.Url,
                        Quantity       = 1,
                        Remarks        = first.Remarks,
                        Status         = OrderItemStatus.Default,
                        Createat       = DateTime.Now,
                    };

                    orderItem.SetCommissionHistory(user.ParentId, commission, (int)(commissionRatio * 100), CommissionStatus.Invalidation);

                    orderItems.Add(orderItem);
                }
            }

            var totalFee       = orderItems.Sum(e => e.Quantity * e.GoodsPrice);
            var actuallyAmount = orderItems.Sum(e => e.Quantity * e.DiscountAmount);
            var walletAmount   = 0;    //钱包扣除金额
            var needPay        = true; //需要支付

            if (request.IsUseWallet)
            {
                assets = await _assetsRepository.Query().FirstOrDefaultAsync(e => e.CustomerId == user.Id);

                if (assets.RepurchaseAmount > 0)
                {
                    walletAmount = assets.RepurchaseAmount >= actuallyAmount ? actuallyAmount : assets.RepurchaseAmount;
                    needPay      = (actuallyAmount - walletAmount) > 0;
                    foreach (var item in orderItems)
                    {
                        if (!needPay && item.CommissionHistory != null)
                        {
                            item.CommissionHistory.Status = CommissionStatus.PendingSettlement;
                        }
                    }
                }
            }

            var order = new Orders(GenerateHelper.GenOrderNo())
            {
                CustomerId     = user.Id,
                OrderStatus    = needPay ? OrderStatus.PendingPayment : OrderStatus.PaymentReceived,
                PaymentType    = request.PaymentType,
                PaymentMethod  = !needPay ? PaymentMethods.Wallet : PaymentMethods.Wechat,
                Remarks        = request.Remarks,
                Createat       = DateTime.Now,
                TotalFee       = totalFee,
                ActuallyAmount = actuallyAmount,
                WalletAmount   = walletAmount,
                ExtendParams   = extendParams,
                PaymentTime    = !needPay ? DateTime.Now : timeNull,
                OrderItems     = orderItems,
            };

            _orderRepository.Insert(order, false);

            using (var transaction = _orderRepository.BeginTransaction())
            {
                await _orderRepository.SaveAsync();

                if (user.ParentId.HasValue && !needPay && totalCommission > 0)
                {
                    await _customerManager.UpdateCommission(user.ParentId.Value, totalCommission);
                }

                if (!needPay && walletAmount > 0)
                {
                    await _customerManager.UpdateAssets(assets, 0, -walletAmount, "商品抵扣");
                }

                transaction.Commit();
            }
            if (needPay)
            {
                return(Result.Ok(_mapper.Map <OrderCreateResponse>(order)));
            }
            else
            {
                return(Result.Fail(ResultCodes.BalancePayment));
            }
        }
Пример #12
0
        /// <summary>
        /// 支付接收
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public async Task PaymentReceived(PaymentReceivedRequest request)
        {
            var order = await _orderRepository.Query()
                        .Include(e => e.OrderItems)
                        .ThenInclude(e => e.CommissionHistory)
                        .FirstOrDefaultAsync(e => e.OrderNo == request.OrderNo);

            if (order == null)
            {
                return;
            }

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

            if (!status.Contains(order.OrderStatus))
            {
                return;
            }

            var         roleResult = false;
            PartnerRole role       = PartnerRole.Default;

            if (!string.IsNullOrEmpty(order.ExtendParams))
            {
                roleResult = Enum.TryParse <PartnerRole>(order.ExtendParams, true, out role);
            }

            var totalCommission = 0;
            var totalAmount     = 0;
            var commissions     = order.OrderItems.Where(e => e.CommissionHistory != null).Select(e => e.CommissionHistory);

            if (commissions.Count() > 0)
            {
                foreach (var item in commissions)
                {
                    if (order.IsFirstOrder)
                    {
                        totalAmount        += item.Commission;
                        item.Status         = CommissionStatus.Complete;
                        item.SettlementTime = DateTime.Now;
                    }
                    else
                    {
                        totalCommission += item.Commission;
                        item.Status      = CommissionStatus.PendingSettlement;
                    }
                }
            }

            order.OrderStatus   = OrderStatus.PaymentReceived;
            order.PaymentMethod = request.PaymentMethod;
            order.PaymentTime   = request.PaymentTime;
            order.PaymentFee    = request.PaymentFee;

            _orderRepository.Update(order, false);

            using (var transaction = _orderRepository.BeginTransaction())
            {
                await _orderRepository.SaveAsync();

                if (roleResult)
                {
                    await _customerRepository.UpdateProperyAsync(new Customer
                    {
                        Id   = order.CustomerId,
                        Role = role
                    }, nameof(Customer.Role));
                }

                if (totalCommission > 0 || totalAmount > 0)
                {
                    var parentId = commissions.Select(e => e.CustomerId).FirstOrDefault();
                    await _customerManager.UpdateAssets(parentId, totalCommission, totalAmount, "下级首单返佣金");
                }

                if (order.WalletAmount > 0)
                {
                    await _customerManager.UpdateAssets(order.CustomerId, 0, 0, -order.WalletAmount, "商品抵扣金额");
                }

                transaction.Commit();
            }
        }
Пример #13
0
        public async Task <Result> SetTrackingNumber(AdminShipmentSetTrackingNumberRequest request)
        {
            var shipment = await _shipmentRepository.Query()
                           .Include(e => e.ShipmentOrderItems).ThenInclude(e => e.OrderItem)
                           .Include(e => e.ShippingAddress)
                           .FirstOrDefaultAsync(e => e.Id == request.Id);

            if (shipment == null)
            {
                return(Result.Fail(ResultCodes.IdInvalid));
            }

            var status = new[] { ShippingStatus.PendingShipment, ShippingStatus.Shipped };

            if (!status.Contains(shipment.ShippingStatus))
            {
                return(Result.Fail(ResultCodes.RequestParamError, "当前订单不允许修改状态"));
            }

            if (string.IsNullOrEmpty(request.CourierCompany))
            {
                shipment.CourierCompany = CourierCompanyHelper.GetCompanyName(request.CourierCompanyCode);
            }
            else
            {
                shipment.CourierCompany = request.CourierCompany;
            }
            shipment.TrackingNumber     = request.TrackingNumber;
            shipment.CourierCompanyCode = request.CourierCompanyCode;
            if (shipment.ShippingStatus != ShippingStatus.Shipped)
            {
                shipment.ShippingStatus = ShippingStatus.Shipped;
                shipment.ShippingTime   = DateTime.Now;

                var orderItems = shipment.ShipmentOrderItems.Select(e => e.OrderItem);
                foreach (var item in orderItems)
                {
                    item.Status = OrderItemStatus.Shipped;
                }

                var message = new AutoReceivedShippingEvent
                {
                    ShipmentId = shipment.Id
                };
                var headers = new Dictionary <string, object>()
                {
                    { "x-delay", 10 * 24 * 60 * 60 * 1000 } // 延迟10天自动收货
                };
                var properties = _client.CreateProperties();
                properties.Headers = headers;

                _client.PushMessage(MQConstants.Exchange, MQConstants.AutoReceivedShippingKey, message, properties);

                var address = shipment.ShippingAddress;
                var notify  = new ShippingNotify
                {
                    TrackingNumber = request.TrackingNumber,
                    UserName       = address.UserName,
                    CourierCompany = shipment.CourierCompany
                };
                await _smsService.SendAsync(address.TelNumber, notify);
            }

            _shipmentRepository.Update(shipment, false);

            using (var transaction = _shipmentRepository.BeginTransaction())
            {
                await _shipmentRepository.SaveAsync();

                transaction.Commit();
            }

            return(Result.Ok());
        }