示例#1
0
        /// <summary>
        /// 插入一条预算
        /// </summary>
        /// <param name="couponTask"></param>
        /// <param name="order"></param>
        /// <param name="productList"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public async ValueTask InsertPromotionTaskBudgetAsync(GetPromotionTaskListByOrderIdRequest request, PromotionTaskModel couponTask, OrderModel order, List <ProductBaseInfo> productList, CancellationToken cancellationToken)
        {
            try
            {
                //根据任务 和 使用规则 查询 发券规则
                var promotionTaskGetRuleList = await promotionTaskPromotionListRepository.GetPromotionTaskPromotionListByPromotionTaskIdAsync(couponTask.PromotionTaskId, cancellationToken).ConfigureAwait(false);

                if (request.CouponRuleIDList != null && request.CouponRuleIDList.Any())
                {
                    promotionTaskGetRuleList = promotionTaskGetRuleList.Where(p => request.CouponRuleIDList.Contains(p.CouponRulesId)).ToList();
                }
                if (!string.IsNullOrWhiteSpace(request.BusinessLineName))
                {
                    promotionTaskGetRuleList = promotionTaskGetRuleList.Where(p => p.BusinessLineName == request.BusinessLineName.Trim()).ToList();
                }

                logger.Info($@"InsertPromotionTaskBudgetAsync check request.OrderID={request.OrderID}, couponTask.PromotionTaskId ={couponTask.PromotionTaskId},promotionTaskGetRuleList.Count {promotionTaskGetRuleList.Count} ");
                foreach (var promotionTaskGetRule in promotionTaskGetRuleList)
                {
                    PromotionTaskBudgetEntity entity = new PromotionTaskBudgetEntity()
                    {
                        PromotionTaskID  = couponTask.PromotionTaskId,
                        CouponRulesId    = promotionTaskGetRule.CouponRulesId,
                        BusinessLineName = promotionTaskGetRule.BusinessLineName,
                        OrderID          = order.OrderId,
                        PIDs             = string.Join(",", productList.Select(p => p.Pid)),

                        DiscountMoney = promotionTaskGetRule.DiscountMoney,
                        CouponNum     = promotionTaskGetRule.Number,
                    };
                    await promotionTaskBudgetRepository.CreateAsync(entity, cancellationToken).ConfigureAwait(false);
                }
            }
            catch (Exception ex)
            {
                logger.LogError($@"InsertPromotionTaskBudgetAsync  exception request.OrderID={request.OrderID}, couponTask.PromotionTaskId ={couponTask.PromotionTaskId} Message = {ex.Message}", ex);
            }
        }
示例#2
0
        /// 验证单个订单和优惠券任务是否匹配,并更新不匹配原因
        /// </summary>
        /// <param name="couponTask"></param>
        /// <param name="order"></param>
        /// <param name="productList"></param>
        /// <param name="shop"></param>
        /// <returns></returns>
        public async Task <bool> CheckPromotionTaskWithOrderAsync(GetPromotionTaskListByOrderIdRequest request, PromotionTaskModel couponTask, OrderModel order, List <ProductBaseInfo> productList, ShopModel shop, List <ChannelDictionariesModel> orderChannelList, CancellationToken cancellationToken)
        {
            logger.Info($"CheckPromotionTaskWithOrderAsync order.PKID={order.PKID} PromotionTaskId={couponTask.PromotionTaskId} productList.Count={productList.Count} OrderListModel.Count={order.OrderListModel.Count()}");
            var products = new List <ProductBaseInfo>(productList);

            #region 订单 order
            //筛选订单时间
            if (couponTask.FilterEndTime.HasValue && couponTask.FilterStartTime.HasValue && (couponTask.FilterStartTime > order.OrderDatetime || couponTask.FilterEndTime < order.OrderDatetime))
            {
                couponTask.IsMatch         = false;
                couponTask.NotMatchMessage = $"订单时间不匹配 OrderDatetime ={order.OrderDatetime}";
                return(false);
            }

            //订单状态
            if (!request.Budget && !string.IsNullOrWhiteSpace(couponTask.OrderStatus))
            {
                if (couponTask.OrderStatus == "Paid" && order.PayStatus != "2Paid")
                {
                    couponTask.IsMatch         = false;
                    couponTask.NotMatchMessage = $"订单状态不符合 PayStatus ={order.PayStatus}";
                    return(false);
                }
                if (couponTask.OrderStatus == "Installed" && order.InstallStatus != "2Installed")
                {
                    couponTask.IsMatch         = false;
                    couponTask.NotMatchMessage = $"订单状态不符合 InstallStatus ={order.InstallStatus}";
                    return(false);
                }
                if (couponTask.OrderStatus == "OrderCompleted")
                {
                    var match = (order.InstallShopId > 0 && order.InstallStatus == "2Installed") ||
                                (
                        ((order.InstallShopId ?? 0) == 0) &&
                        order.Status == "2Shipped" &&
                        (order.DeliveryStatus == "3Received" || order.DeliveryStatus == "3.5Signed")
                                );
                    if (!match)
                    {
                        couponTask.IsMatch         = false;
                        couponTask.NotMatchMessage = $"订单状态不符合 OrderStatus ={order.InstallStatus},{order.Status},{order.DeliveryStatus}";
                        return(false);
                    }
                }
            }

            //筛选渠道-OrderChannel
            var taskChannelList = couponTask.Channel?.Split(new char[] { ',', ',' })?.ToList();
            if (taskChannelList != null && taskChannelList.Any())
            {
                var taskOrderChannelList = orderChannelList.Where(p => taskChannelList.Contains(p.ChannelType) || taskChannelList.Contains(p.ChannelKey)).ToList();

                if (taskOrderChannelList.Where(p => p.ChannelKey == order.OrderChannel)?.Count() == 0)
                {
                    couponTask.IsMatch         = false;
                    couponTask.NotMatchMessage = $"订单渠道不匹配 OrderChannel ={order.OrderChannel}";
                    return(false);
                }
            }

            //安装状态-InstallType
            if (!request.Budget && couponTask.InstallType > 0)
            {
                var installTypeList = couponTask.InstallType == 1 ? new List <string>()
                {
                    "1ShopInstall"
                } : new List <string>()
                {
                    "3NoInstall", "4SentInstall"
                };
                if (!installTypeList.Contains(order.InstallType))
                {
                    couponTask.IsMatch         = false;
                    couponTask.NotMatchMessage = $"订单安装状态不匹配 InstallType ={order.InstallType}";
                    return(false);
                }
            }

            //地域
            if (!string.IsNullOrWhiteSpace(couponTask.Area))
            {
                var areaList = couponTask.Area?.Split(new char[] { ',', ',' })?.ToList();
                if (shop == null || !areaList.Contains(shop.CityId.ToString()))
                {
                    couponTask.IsMatch         = false;
                    couponTask.NotMatchMessage = $"门店地域不符合 CityId = {shop?.CityId}";
                    return(false);
                }
            }

            #endregion

            #region 子订单 orderList 产品相关=> 最后计算总的件数和金额
            //PID
            if (!string.IsNullOrWhiteSpace(couponTask.Pid))
            {
                var pidList = couponTask.Pid?.Split(new char[] { ',', ',' })?.ToList();
                products = products.Where(p => pidList.Contains(p.Pid)).ToList();
                if (!products.Any())
                {
                    couponTask.IsMatch         = false;
                    couponTask.NotMatchMessage = $"Pid不符合 ={JsonConvert.SerializeObject(productList.Select(p => p.Pid))} ";
                    return(false);
                }
            }

            //品牌 【brand】
            if (!string.IsNullOrWhiteSpace(couponTask.Brand))
            {
                var brandList = couponTask.Brand?.Split(new char[] { ',', ',' })?.ToList();
                products = products.Where(p => brandList.Contains(p.Brand)).ToList();
                if (!products.Any())
                {
                    couponTask.IsMatch         = false;
                    couponTask.NotMatchMessage = $"产品品牌不符合 Brand= {JsonConvert.SerializeObject(productList.Select(p => p.Brand))}";
                    return(false);
                }
            }

            //产品类别  【category】
            var categoryList = await GetPromotionTaskCategoryMemoryCacheAsync(couponTask.PromotionTaskId, cancellationToken).ConfigureAwait(false);

            if (categoryList != null && categoryList.Any())
            {
                couponTask.Category = string.Join(",", categoryList);
                //couponTask.Category += (couponTask.Category.IndexOf('.') > 0 ? "" : ".");
                products = products.Where(p => !string.IsNullOrWhiteSpace(p.NodeNo)).Where(p => p.NodeNo.Split('.').ToList().Intersect(categoryList).Count() > 0).ToList();
                if (!products.Any())
                {
                    couponTask.IsMatch         = false;
                    couponTask.NotMatchMessage = $"产品分类不符合 Category = {JsonConvert.SerializeObject(productList.Select(p => p.NodeNo))} ";
                    return(false);
                }
            }

            //订单类型 【套装】
            if (couponTask.ProductType == 2)  //套装
            {
                products = products.Where(p => p.IsPackageProduct == true).ToList();
                if (!products.Any())
                {
                    couponTask.IsMatch         = false;
                    couponTask.NotMatchMessage = $"产品套装不符合 IsPackageProduct =  {JsonConvert.SerializeObject(productList.Select(p => p.IsPackageProduct))}";
                    return(false);
                }
            }
            if (couponTask.ProductType == 3)  //非套装
            {
                products = products.Where(p => p.IsPackageProduct == null || p.IsPackageProduct == false).ToList();
                if (!products.Any())
                {
                    couponTask.IsMatch         = false;
                    couponTask.NotMatchMessage = $"产品套装不符合 IsPackageProduct =  {JsonConvert.SerializeObject(productList.Select(p => p.IsPackageProduct))}";
                    return(false);
                }
            }

            List <OrderListModel> OrderListModel = order.OrderListModel.Where(o => products.Select(p => p.Pid).Contains(o.Pid)).ToList();
            //最后判断 购买件数-PurchaseNum
            if (couponTask.PurchaseNum > 0)
            {
                int totalNum = OrderListModel.Sum(p => p.Num);
                var flag     = (couponTask.PurchaseNum < 1000 && totalNum == couponTask.PurchaseNum) ||//==指定数量
                               (couponTask.PurchaseNum >= 1000 && couponTask.PurchaseNum < 2000 && totalNum <= couponTask.PurchaseNum - 1000) || //<=0 指定数量
                               (couponTask.PurchaseNum >= 2000 && couponTask.PurchaseNum < 3000 && totalNum >= couponTask.PurchaseNum - 2000) //>=0 指定数量
                ;
                if (!flag)
                {
                    couponTask.IsMatch         = false;
                    couponTask.NotMatchMessage = $"购买件数不匹配 PurchaseNum ={ totalNum }";
                    return(false);
                }
            }
            decimal totalMoney = OrderListModel.Sum(p => p.TotalPrice);
            //最后判断 购买金额-SumMoney
            if (couponTask.SpendMoney > 0 && totalMoney < couponTask.SpendMoney)
            {
                couponTask.IsMatch         = false;
                couponTask.NotMatchMessage = $"订单金额不匹配 SumMoney ={totalMoney}";
                return(false);
            }
            #endregion

            couponTask.IsMatch         = true;
            couponTask.NotMatchMessage = "";
            //成功,插入预算
            if (request.Budget)
            {
                await InsertPromotionTaskBudgetAsync(request, couponTask, order, products, cancellationToken).ConfigureAwait(false);
            }


            return(true);
        }