/// <summary>
 /// 批量获取活动商品已售数量缓存数据
 /// </summary>
 /// <param name="activityId"></param>
 /// <param name="pidList"></param>
 /// <returns></returns>
 public async Task <OperationResult <IEnumerable <ActivityPidSoldNumModel> > > GetOrSetActivityProductSoldNumCacheAsync(string activityId, List <string> pidList)
 {
     if (string.IsNullOrEmpty(activityId) || !(pidList?.Count > 0))
     {
         return(OperationResult.FromError <IEnumerable <ActivityPidSoldNumModel> >("1", "传入参数错误"));
     }
     return(OperationResult.FromResult(await DiscountActivityInfoManager.GetOrSetActivityProductSoldNumCache(activityId, pidList)));
 }
 /// <summary>
 /// 批量获取用户活动已购数量缓存数据
 /// </summary>
 /// <param name="userId"></param>
 /// <param name="activityIdList"></param>
 /// <returns></returns>
 public async Task <OperationResult <IEnumerable <UserActivityBuyNumModel> > > GetOrSetUserActivityBuyNumCacheAsync(string userId, List <string> activityIdList)
 {
     if (string.IsNullOrEmpty(userId) || !(activityIdList?.Count > 0))
     {
         return(OperationResult.FromError <IEnumerable <UserActivityBuyNumModel> >("1", "传入参数错误"));
     }
     return(OperationResult.FromResult(await DiscountActivityInfoManager.GetOrSetUserActivityBuyNumCache(userId, activityIdList)));
 }
 /// <summary>
 /// 取消订单时 修改订单折扣记录
 /// </summary>
 /// <param name="orderInfoList"></param>
 /// <returns></returns>
 public async Task <OperationResult <bool> > UpdateCancelOrderDiscountInfoAndSetCacheAsync(int orderId)
 {
     if (!(orderId > 0))
     {
         return(OperationResult.FromError <bool>("1", "未传入参数"));
     }
     return(await DiscountActivityInfoManager.UpdateCancelOrderDiscountInfoAndSetCache(orderId));
 }
 /// <summary>
 /// 获取商品的打折活动信息和用户限购数
 /// </summary>
 /// <param name="pidList"></param>
 /// <param name="userId"></param>
 /// <returns></returns>
 public async Task <OperationResult <IEnumerable <ProductDiscountActivityInfo> > > GetProductAndUserDiscountInfoAsync(List <string> pidList, string userId)
 {
     if (!(pidList?.Count > 0))
     {
         return(OperationResult.FromError <IEnumerable <ProductDiscountActivityInfo> >("1", "未传入参数商品Pid"));
     }
     pidList = pidList.Distinct().ToList();
     return(await DiscountActivityInfoManager.GetProductAndUserDiscountInfoAsync(pidList, userId));
 }
Exemplo n.º 5
0
        /// <summary>
        /// 遍历每个活动组
        /// </summary>
        /// <returns></returns>
        private async Task ForEachActivityGroup()
        {
            foreach (var group in _productGroups)
            {
                var currentActivityId                = group.Key;
                var currentActivity                  = _activities.FirstOrDefault(s => string.Equals(s.ActivityId, currentActivityId));
                var currentActivityPids              = group.Select(g => g.Pid).ToList();
                var currentActivityRequestNum        = group.Sum(s => s.RequestNum);
                var currentActivityRequestTotalPrice = group.Sum(s => s.RequestNum * s.RequestPrice);
                var userBuyNum = await DiscountActivityInfoManager.GetOrSetUserActivityBuyNumCache(_userId, new List <string>() { currentActivityId });

                if (_isCreateOrder)
                {
                    await DiscountActivityInfoManager.IncreaseUserActivityBuyNumCache(_userId, currentActivityId, currentActivityRequestNum, TimeSpan.FromMinutes(1));
                }
                var currentActivityUserAlreadyBuyNum = userBuyNum?.FirstOrDefault()?.BuyNum ?? 0;

                if (currentActivity != null)
                {
                    var currentActivityRules = _activityDiscountRules.Where(s => string.Equals(currentActivityId, s.ActivityId)).ToList();
                    if (!currentActivityRules.Any())
                    {
                        _returnList.AddRange(group.Select(g => new ProductHitDiscountResponse()
                        {
                            DiscountPrice       = g.RequestPrice,
                            HasDiscountActivity = false,
                            DiscountRule        = null,
                            IsHit       = false,
                            Pid         = g.Pid,
                            FailCode    = nameof(ProductHitFailCode.NoneActivityDiscount),
                            FailMessage = ProductHitFailCode.NoneActivityDiscount,
                        }));
                        continue;
                    }
                    if (currentActivity.Is_PurchaseLimit == 1 && currentActivity.LimitQuantity < currentActivityUserAlreadyBuyNum + currentActivityRequestNum)//当前活动用户限购
                    {
                        _returnList.AddRange(group.Select(g => new ProductHitDiscountResponse()
                        {
                            DiscountPrice       = g.RequestPrice,
                            HasDiscountActivity = true,
                            DiscountRule        = null,
                            IsHit       = false,
                            Pid         = g.Pid,
                            FailCode    = nameof(ProductHitFailCode.UserBeLimited),
                            FailMessage = ProductHitFailCode.UserBeLimited,
                        }));
                        continue;
                    }
                    var productSoldNums = (await DiscountActivityInfoManager.GetOrSetActivityProductSoldNumCache(currentActivityId, currentActivityPids));
                    await ForEachActivityGroupProducts(group, productSoldNums, currentActivityRules,
                                                       currentActivity, currentActivityRequestNum, currentActivityRequestTotalPrice);
                }
            }
        }
 /// <summary>
 /// 创建订单时记录订单打折信息
 /// </summary>
 /// <param name="orderInfoList"></param>
 /// <returns></returns>
 public async Task <OperationResult <bool> > SaveCreateOrderDiscountInfoAndSetCacheAsync(List <DiscountCreateOrderRequest> orderInfoList)
 {
     // 验证参数
     orderInfoList = orderInfoList?.Where(a =>
                                          !string.IsNullOrWhiteSpace(a.ActivityId) && !string.IsNullOrWhiteSpace(a.Pid) &&
                                          !string.IsNullOrWhiteSpace(a.UserId) && a.Num > 0)?.ToList();
     if (!(orderInfoList?.Count > 0))
     {
         return(OperationResult.FromError <bool>("1", "参数不正确"));
     }
     return(await DiscountActivityInfoManager.SaveCreateOrderDiscountInfoAndSetCache(orderInfoList));
 }
        /// <summary>
        /// 修改活动的审核状态
        /// </summary>
        /// <param name="activityId"></param>
        /// <param name="auditUserName"></param>
        /// <param name="auditStatus"></param>
        /// <param name="remark"></param>
        /// <returns></returns>
        public static async Task <OperationResult <bool> > SetActivityAuditStatusAsync(string activityId, string auditUserName, int auditStatus, string remark)
        {
            bool result;

            result = await DalSalePromotionActivity.SetActivityAuditStatusAsync(activityId, auditUserName, auditStatus, remark);

            if (result && auditStatus == 2)
            {
                //审核活动, 自动上下架
                await DiscountActivityInfoManager.AuditShelveActivityProduct(activityId);
            }
            return(OperationResult.FromResult(result));;
        }
 /// <summary>
 /// 获取时间段内商品的活动信息列表
 /// </summary>
 /// <param name="pidList"></param>
 /// <param name="startTime"></param>
 /// <param name="endTime"></param>
 /// <returns></returns>
 public async Task <OperationResult <IEnumerable <ProductActivityInfoForTag> > > GetProductDiscountInfoForTagAsync(List <string> pidList, DateTime startTime, DateTime endTime)
 {
     if (!(pidList?.Count > 0))
     {
         return(OperationResult.FromError <IEnumerable <ProductActivityInfoForTag> >("1", "请传入商品pid"));
     }
     if (startTime == null || startTime == new DateTime())
     {
         return(OperationResult.FromError <IEnumerable <ProductActivityInfoForTag> >("2", "请传入活动开始时间"));
     }
     if (endTime == null || endTime == new DateTime())
     {
         return(OperationResult.FromError <IEnumerable <ProductActivityInfoForTag> >("3", "请传入活动结束时间"));
     }
     if (startTime >= endTime)
     {
         return(OperationResult.FromError <IEnumerable <ProductActivityInfoForTag> >("4", "开始时间应小于结束时间"));
     }
     pidList = pidList?.Distinct().ToList();
     return(await DiscountActivityInfoManager.GetProductDiscountInfoForTagAsync(pidList, startTime, endTime));
 }
Exemplo n.º 9
0
        /// <summary>
        /// 遍历活动组内的每个产品
        /// </summary>
        /// <param name="group"></param>
        /// <param name="productSoldNums"></param>
        /// <param name="currentActivityRules"></param>

        private async Task ForEachActivityGroupProducts(IGrouping <string, CompProduct> group, IEnumerable <ActivityPidSoldNumModel> productSoldNums,
                                                        List <SalePromotionActivityDiscount> currentActivityRules, SalePromotionActivityModel currentActivity,
                                                        int currentActivityRequestNum, decimal currentActivityRequestTotalPrice)
        {
            var effictiveCurrentActivityRequestNumAndPrice = GetEffictiveCurrentActivityRequestNumAndPrice(group, productSoldNums, currentActivityRules, currentActivity,
                                                                                                           currentActivityRequestNum, currentActivityRequestTotalPrice);

            currentActivityRequestNum        = effictiveCurrentActivityRequestNumAndPrice.Item1;
            currentActivityRequestTotalPrice = effictiveCurrentActivityRequestNumAndPrice.Item2;
            foreach (var product in group)
            {
                if (_isCreateOrder)
                {
                    await DiscountActivityInfoManager.IncreaseActivityProductSoldNumCache(currentActivity.ActivityId, product.Pid, product.RequestNum, TimeSpan.FromMinutes(1));
                }
                if (_verifyPayAndInstallMethod)
                {
                    if (product.Pid.StartsWith("TR", StringComparison.CurrentCultureIgnoreCase) && currentActivity.InstallMethod > 0 && product.RequestInstallMethod != currentActivity.InstallMethod)
                    {
                        _returnList.Add(new ProductHitDiscountResponse()
                        {
                            DiscountPrice       = product.RequestPrice,
                            HasDiscountActivity = true,
                            DiscountRule        = null,
                            IsHit       = false,
                            Pid         = product.Pid,
                            FailCode    = ProductHitFailCode.GetFailCodeAndDescriptionOfInstall(currentActivity.InstallMethod).Item1,
                            FailMessage = ProductHitFailCode.GetFailCodeAndDescriptionOfInstall(currentActivity.InstallMethod).Item2,
                        });
                        continue;
                    }
                    if (product.Pid.StartsWith("TR", StringComparison.CurrentCultureIgnoreCase) && currentActivity.PaymentMethod > 0 && product.RequestPaymentMethod != currentActivity.PaymentMethod)
                    {
                        _returnList.Add(new ProductHitDiscountResponse()
                        {
                            DiscountPrice       = product.RequestPrice,
                            HasDiscountActivity = true,
                            DiscountRule        = null,
                            IsHit       = false,
                            Pid         = product.Pid,
                            FailCode    = ProductHitFailCode.GetFailCodeAndDescriptionOfPay(currentActivity.PaymentMethod).Item1,
                            FailMessage = ProductHitFailCode.GetFailCodeAndDescriptionOfPay(currentActivity.PaymentMethod).Item2,
                        });
                        continue;
                    }
                }
                var currentProductSoldNum = productSoldNums.FirstOrDefault(s => string.Equals(s.Pid, product.Pid))?.SoldNum ?? 0;
                if (product.LimitQuantity < currentProductSoldNum + product.RequestNum)
                {
                    _returnList.Add(new ProductHitDiscountResponse()
                    {
                        DiscountPrice       = product.RequestPrice,
                        HasDiscountActivity = true,
                        DiscountRule        = null,
                        IsHit       = false,
                        Pid         = product.Pid,
                        FailCode    = nameof(ProductHitFailCode.NotEnoughStock),
                        FailMessage = ProductHitFailCode.NotEnoughStock,
                    });
                    continue;
                }
                var judgeHitResult = JudgeHitDiscount(product.Pid, product.RequestPrice, product.RequestNum, currentActivityRules,
                                                      currentActivityRequestNum, currentActivityRequestTotalPrice);
                var isHit = judgeHitResult.Item1;
                _returnList.Add(new ProductHitDiscountResponse()
                {
                    DiscountPrice       = judgeHitResult.Item2,
                    HasDiscountActivity = true,
                    DiscountRule        = judgeHitResult.Item3,
                    IsHit    = isHit,
                    Pid      = product.Pid,
                    FailCode = !isHit ? judgeHitResult.Item3.DiscountMethod == 1 ? nameof(ProductHitFailCode.NotEnoughMoney) :
                               nameof(ProductHitFailCode.NotEnoughNum) : string.Empty,
                    FailMessage = !isHit ? judgeHitResult.Item3.DiscountMethod == 1 ? ProductHitFailCode.NotEnoughMoney :
                                  ProductHitFailCode.NotEnoughNum : string.Empty,
                });
            }
        }