/// <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); } }
/// 验证单个订单和优惠券任务是否匹配,并更新不匹配原因 /// </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); }