private void AddItemsRecursive(NodeContentBase nodeContent, PromotionItems itemsOnPromotion, List <CatalogContentBase> conditionProducts) { foreach (var child in _contentLoader.GetChildren <CatalogContentBase>(nodeContent.ContentLink)) { AddIfProduct(child, conditionProducts); var childNode = child as NodeContentBase; if (childNode != null && itemsOnPromotion.Condition.IncludesSubcategories) { AddItemsRecursive(childNode, itemsOnPromotion, conditionProducts); } } }
private IEnumerable <CatalogContentBase> GetProductsForPromotion(PromotionItems itemsOnPromotion) { var conditionProducts = new List <CatalogContentBase>(); foreach (var conditionItemReference in itemsOnPromotion.Condition.Items) { var conditionItem = _contentLoader.Get <CatalogContentBase>(conditionItemReference); AddIfProduct(conditionItem, conditionProducts); var nodeContent = conditionItem as NodeContentBase; if (nodeContent != null) { AddItemsRecursive(nodeContent, itemsOnPromotion, conditionProducts); } } return(conditionProducts); }
/// <summary> /// 根据商品id获取活动类型 /// </summary> /// <param name="commodityId"></param> /// <returns></returns> public int JudgeActivityTypeExt(Guid commodityId) { try { DateTime now = DateTime.Now; List <TodayPromotionDTO> s = (from p in PromotionItems.ObjectSet() join pro in Promotion.ObjectSet() on p.PromotionId equals pro.Id where p.CommodityId == commodityId && !pro.IsDel && pro.IsEnable && pro.EndTime >= now && (pro.StartTime <= now || pro.PresellStartTime <= now) orderby pro.PromotionType descending select new TodayPromotionDTO() { PromotionType = pro.PromotionType, }).ToList(); int proList = 0; if (s != null) { foreach (var item in s) { proList = item.PromotionType; } } else { proList = 9; } return(proList); } catch (Exception ex) { LogHelper.Error(string.Format("获取商品活动类型异常{0}", commodityId), ex); throw; } }
/// <summary> /// 根据用户ID查询收藏商品 /// </summary> /// <param name="search"></param> /// <returns></returns> public System.Collections.Generic.List <Jinher.AMP.BTP.Deploy.CustomDTO.CommodityListCDTO> GetCollectionComsExt(SetCollectionSearchDTO search) { DateTime now = DateTime.Now; List <CommodityListCDTO> result = new List <CommodityListCDTO>(); try { if (search == null || search.UserId == Guid.Empty || search.ChannelId == Guid.Empty || search.PageIndex < 1 || search.PageSize < 1) { return(result); } var commodityList = (from setCollection in SetCollection.ObjectSet() join commodity in Commodity.ObjectSet() on setCollection.ColKey equals commodity.Id where setCollection.ColType == 1 && setCollection.UserId == search.UserId && commodity.IsDel == false && commodity.State == 0 && commodity.CommodityType == 0 && setCollection.ChannelId == search.ChannelId orderby setCollection.SubTime descending select new CommodityListCDTO { Id = commodity.Id, Pic = commodity.PicturesPath, Price = commodity.Price, State = commodity.State, Stock = commodity.Stock, Name = commodity.Name, MarketPrice = commodity.MarketPrice, AppId = commodity.AppId, ComAttrType = (commodity.ComAttribute == "[]" || commodity.ComAttribute == null) ? 1 : 3 }).Skip((search.PageIndex - 1) * search.PageSize) .Take(search.PageSize).ToList(); if (!commodityList.Any()) { return(result); } var appIds = commodityList.Select(c => c.AppId).Distinct().ToList(); #region 众筹 if (CustomConfig.CrowdfundingFlag) { var cfAppIds = Crowdfunding.ObjectSet().Where(c => appIds.Contains(c.AppId) && c.StartTime < now && c.State == 0).Select(m => m.AppId).ToList(); if (cfAppIds.Any()) { foreach (var commodityListCdto in commodityList) { if (cfAppIds.Any(c => c == commodityListCdto.AppId)) { commodityListCdto.IsActiveCrowdfunding = true; } } } } #endregion List <Guid> commodityIds = commodityList.Select(c => c.Id).ToList(); var promotionDic = (from p in PromotionItems.ObjectSet() join pro in Promotion.ObjectSet() on p.PromotionId equals pro.Id where commodityIds.Contains(p.CommodityId) && !pro.IsDel && pro.IsEnable && (pro.StartTime <= now || pro.PresellStartTime <= now) && pro.EndTime >= now select new { ComId = p.CommodityId, Intensity = (decimal)p.Intensity, DiscountPrice = (decimal)p.DiscountPrice, StartTime = pro.StartTime, EndTime = pro.EndTime, PresellStartTime = pro.PresellStartTime, PresellEndTime = "", LimitBuyEach = p.LimitBuyEach, LimitBuyTotal = p.LimitBuyTotal, SurplusLimitBuyTotal = p.SurplusLimitBuyTotal, PromotionType = pro.PromotionType } ).Distinct(); foreach (var commodity in commodityList) { var promotion = promotionDic.FirstOrDefault(c => c.ComId == commodity.Id); if (promotion != null) { commodity.LimitBuyEach = promotion.LimitBuyEach ?? -1; commodity.LimitBuyTotal = promotion.LimitBuyTotal ?? -1; commodity.SurplusLimitBuyTotal = promotion.SurplusLimitBuyTotal ?? 0; if (promotion.DiscountPrice > -1) { commodity.DiscountPrice = Convert.ToDecimal(promotion.DiscountPrice); commodity.Intensity = 10; continue; } commodity.DiscountPrice = -1; commodity.Intensity = promotion.Intensity; commodity.PromotionType = promotion.PromotionType; } else { commodity.DiscountPrice = -1; commodity.Intensity = 10; commodity.LimitBuyEach = -1; commodity.LimitBuyTotal = -1; commodity.SurplusLimitBuyTotal = -1; commodity.PromotionType = 9999; } } return(commodityList); } catch (Exception e) { LogHelper.Error("SetCollectionSV.GetCollectionComsExt,获取收藏商品列表查询错误" + e); return(new List <CommodityListCDTO>()); } }
/* RewardDescription is "checking" whether the promotion was fulfilled (or not, or partially), * ...which items the promotion was applied to... * ...the fake-cart is taken care of) * PromotionProcessorBase has one abstract method to be implemented, Evaluate. * ...the method is supplied with a PromotionData, and a PromotionProcessorContext object * ...that contains information about the current order/fakeCart. */ protected override RewardDescription Evaluate( // note: it's OrderForm now... MyPercentagePromotion promotionData // the model --> look in the UI to see the properties , PromotionProcessorContext context) { /* A reward description contains information about if and how a reward is applied. * ...some properties are: * - A list of redemption descriptions, one for each of the maximum amount of redemptions * ...that could be applied to the current order. * This does not have to take redemption limits into consideration, that is handled by the * promotion engine. * - A reward type. Depending on the type, the promotion value is read from the properties * UnitDiscount, Percentage or Quantity. * - A status flag. Indicates if a promotion is not, partially, or fully fulfilled. * - A saved amount. The amount by which this reward reduces the order cost. * Is set by the promotion engine; should not be set in the promotion processor*/ IOrderForm orderForm = context.OrderForm; // OrderForm now pops in with the context //context. // lots of things IEnumerable <ILineItem> lineItemsCheck = orderForm.GetAllLineItems(); IEnumerable <ILineItem> lineItems = GetLineItems(context.OrderForm); #region Just Checking //var e = _contentLoader.Get<EntryContentBase>(item0); //should check if it's applicable... at all //var li = _orderFactory.Service.CreateLineItem(e.Code); //li.Quantity = 1; //li.PlacedPrice = 15; //orderForm.Shipments.First().LineItems.Add(li); #endregion // GetFulfillmentStatus - extension method FulfillmentStatus status = promotionData.MinNumberOfItems.GetFulfillmentStatus( orderForm, _targetEvaluator, _fulfillmentEvaluator); List <RewardDescription> rewardDescriptions = new List <RewardDescription>(); List <RedemptionDescription> redemptionDescriptions = new List <RedemptionDescription>(); #region NewStuff // The below does not see the cart, it's for landing pages for the Promotion itself (rendering) PromotionItems promoItems = GetPromotionItems(promotionData); // gets null var condition = promotionData.PercentageDiscount; // ...in the model var targets = promotionData.DiscountTargets; // get one in any case, points to what's at "promo" var skuCodes = _targetEvaluator.GetApplicableCodes( lineItems, targets.Items, targets.MatchRecursive); // get one if kicked in, 0 if not var fulfillmentStatus = _fulfillmentEvaluator.GetStatusForBuyQuantityPromotion( skuCodes , lineItems , promotionData.MinNumberOfItems.RequiredQuantity , promotionData.PartialFulfillmentNumberOfItems); // Just checking // The promotion engine creates a "price matrix" for all items in the order form. // OrderFormPriceMatrix, is accessible through the EntryPrices property // of the PromotionProcessorContext object. // PromotionProcessorContext is passed to the Evaluate method as one of the arguments. // ...the matrix holds "codes" and quantity // The second ExtractEntries call starts to receive entries where the first call ended. // ... makes it easy to create several redemptions by calling ExtractEntries in a loop, // ... and create one RedemptionDescription inside the loop. // The price matrix has one public method (ExtractEntries) // ... two overloads, both overloads takes entry codes and quantity as parameters. // ... one contains an action for getting the entries in a specific order. // ... if no specific order is specified, MostExpensiveFirst is used. var affectedEntries = context.EntryPrices.ExtractEntries( skuCodes, 1); // get one if it kicks in, null if not if (affectedEntries != null) { IEnumerable <PriceEntry> priceEntries = affectedEntries.PriceEntries; foreach (var item in priceEntries) { var qty = item.Quantity; var price = item.Price; var calc = item.CalculatedTotal; // involves the Qty var actuals = item.ActualTotal; // includes rounding } } // could have a look here switch (fulfillmentStatus) { case FulfillmentStatus.NotFulfilled: break; case FulfillmentStatus.PartiallyFulfilled: break; case FulfillmentStatus.Fulfilled: break; case FulfillmentStatus.CouponCodeRequired: break; case FulfillmentStatus.Excluded: break; case FulfillmentStatus.VisitorGroupRequired: break; case FulfillmentStatus.RedemptionLimitReached: break; case FulfillmentStatus.NoMoneySaved: break; case FulfillmentStatus.InvalidCoupon: break; case FulfillmentStatus.InvalidCombination: break; case FulfillmentStatus.MissingVisitorGroup: break; case FulfillmentStatus.NoRedemptionRemaining: break; case FulfillmentStatus.Ineffective: break; default: break; } // ... an extension method return(RewardDescription.CreatePercentageReward( fulfillmentStatus , GetRedemptions(skuCodes, promotionData, context) , promotionData , promotionData.PercentageDiscount.Percentage //, fulfillmentStatus.GetRewardDescriptionText() , fulfillmentStatus.GetRewardDescriptionText() + " : " + promotionData.Description + " : " )); #endregion #region Older stuff and debug - no show #region Older not in use //RewardDescription rewardDescription = new RewardDescription(); //var codes = _targetEvaluator.GetApplicableCodes(lineItems,) //_fulfillmentEvaluator.GetStatusForBuyQuantityPromotion( // ) #endregion // new stuff #region Previous version //if (status.HasFlag(FulfillmentStatus.Fulfilled)) //{ // return RewardDescription.CreateMoneyOrPercentageRewardDescription( // status, // redemptionDescriptions, // promotionData, // promotionData.PercentageDiscount, // context.OrderGroup.Currency, // "Custom promotion fulfilled"); // should have a more flexible way... GetDescription() //} //else //{ // return RewardDescription.CreateNotFulfilledDescription( // promotionData, FulfillmentStatus.NotFulfilled); //} #endregion #region Debug //RedemptionDescription rFirst; //redemptionDescriptions.Add(CreateRedemptionDescriptionText(orderForm)); // below "if-construct" is for debug //if (promotionData.PercentageDiscount <= 0) // ... return "sorry, no discount" //{ // return RewardDescription.CreatePercentageReward( // FulfillmentStatus.NotFulfilled, // redemptionDescriptions, // promotionData, // 0, // CreateRewardDescriptionText(redemptionDescriptions.First(), FulfillmentStatus.NotFulfilled, promotionData)); // /*RewardDescription.CreateMoneyOrPercentageRewardDescription(FulfillmentStatus.NotFulfilled,r,promotionData,null);*/ //} //IEnumerable<ContentReference> targetItems = promotionData.DiscountTargets.Items.ToList(); // set by the Promo-UI //bool matchRecursive = true; // walking down the catalog hierarchy //var lineItems = GetLineItems(orderForm); // "GetLineItems" - in the base class (PromotionProcessorBase) //var affectedItems = _targetEvaluator.GetApplicableItems(lineItems, targetItems, matchRecursive); // in CollectionTargetEvaluator //var affectedItems = _targetEvaluator.GetApplicableCodes(orderForm.GetAllLineItems(), targetItems, false); // small class --> just to get the status by the settings //var status = FulfillmentEvaluator.GetStatusForBuyQuantityPromotion(affectedItems.Select(x => x.LineItem) // , promotionData.MinNumberOfItems, promotionData.PartialFulfillmentNumberOfItems); // in the model //var s = FulfillmentEvaluator. //FulfillmentEvaluator ff = new FulfillmentEvaluator(); //if (rewardDescriptions.Any()) //{ // return rewardDescriptions.First(); //} //else //{ // return null; //} /*return RewardDescription.CreateMoneyOrPercentageRewardDescription( * status, * affectedItems, * promotionData, * promotionData.PercentageDiscount, * GetRewardDescriptionText(affectedItems, status, promotionData));*/ #endregion #endregion } // end RewardDescription
/// <summary> /// 获取订单中的商品列表 /// </summary> /// <param name="Code"></param> /// <returns></returns> public OrderForShareDTO GetOrderCommoditysExt(System.Guid orderId) { OrderForShareDTO orderForShareDTO = new OrderForShareDTO(); //查询订单信息 var order = CommodityOrder.ObjectSet().Where(o => o.Id == orderId).FirstOrDefault(); if (order == null) { return(null); } Guid userId = order.UserId; Guid appId = order.AppId; orderForShareDTO.AppId = appId; //查询购买者信息 CommodityUser userInfo = CommodityUser.ObjectSet().Where(u => u.Id == userId && u.AppId == appId).FirstOrDefault(); if (userInfo != null) { orderForShareDTO.UserName = userInfo.Name; orderForShareDTO.UserPhoto = userInfo.HeadPic; } //查询订单中商品数量 var count = OrderItem.ObjectSet().Where(o => o.CommodityOrderId == orderId).Sum(o => o.Number); orderForShareDTO.Count = count; //查询订单中随机的一件商品 OrderItem orderitem = OrderItem.ObjectSet().Where(o => o.CommodityOrderId == orderId).FirstOrDefault(); if (orderitem != null) { Commodity commodity = Commodity.ObjectSet().Where(o => o.Id == orderitem.CommodityId).FirstOrDefault(); orderForShareDTO.RealPrice = orderitem.RealPrice; orderForShareDTO.Days = 0; // 获取距离促销还剩下多少天 var days = (from i in Promotion.ObjectSet() join y in PromotionItems.ObjectSet() on i.Id equals y.PromotionId where DateTime.Now > i.StartTime && DateTime.Now < i.EndTime && y.CommodityId == orderitem.CommodityId && !i.IsDel && i.IsEnable select new PromotionSDTO { EndTime = i.EndTime }).ToList(); if (days.Count > 0) { TimeSpan ts = days[0].EndTime - DateTime.Now; if (ts.TotalSeconds > 0) { if (ts.TotalSeconds % (3600 * 24) > 0) { orderForShareDTO.Days = ts.Days + 1; } else { orderForShareDTO.Days = ts.Days; } } } if (commodity != null) { orderForShareDTO.CommodityDTO = commodity.ToEntityData(); } } return(orderForShareDTO); }
/// <summary> /// 成团自动退款 -- JOB调用 /// </summary> /// <returns></returns> public Jinher.AMP.BTP.Deploy.CustomDTO.ResultDTO VoluntarilyRefundDiyGroupExt() { try { ContextSession contextSession = ContextFactory.CurrentThreadContext; //获取所有组团未成功,但是没有手动退款的拼团订单 var diyQuery = (from diy in DiyGroup.ObjectSet() join c in Commodity.ObjectSet() on diy.CommodityId equals c.Id join ps in PromotionItems.ObjectSet() on c.Id equals ps.CommodityId join p in Promotion.ObjectSet() on ps.PromotionId equals p.Id where diy.JoinNumber != 0 && diy.PromotionId == p.Id && diy.State == 4 select new DiyGroupManageVM { DiyId = diy.Id, AppId = diy.EsAppId }); diyQuery = diyQuery.Distinct(); List <DiyGroupConfig> list = new List <DiyGroupConfig>(); foreach (var diyGroupManageVm in diyQuery) { DiyGroupConfigCDTO diyGroupConfig; if (list.Count > 0 && list.Any(t => t.EsAppId == diyGroupManageVm.AppId)) { diyGroupConfig = list.FirstOrDefault(t => t.EsAppId == diyGroupManageVm.AppId).DiyGroupConfigCdto; } else { diyGroupConfig = TPS.ZPHSV.Instance.GetDiyGroupConfig(diyGroupManageVm.AppId); DiyGroupConfig diyGroupConfigBp = new DiyGroupConfig { EsAppId = diyGroupManageVm.AppId, DiyGroupConfigCdto = diyGroupConfig }; list.Add(diyGroupConfigBp); } if (diyGroupConfig.IsRefund) { var query = DiyGroup.ObjectSet().FirstOrDefault(n => n.Id == diyGroupManageVm.DiyId && n.EsAppId == diyGroupManageVm.AppId); if (query != null) { query.State = 5; query.ModifiedOn = DateTime.Now; query.EntityState = EntityState.Modified; } } } contextSession.SaveChange(); } catch (Exception ex) { LogHelper.Error(string.Format("成团自动退款 -- JOB调用"), ex); return(new ResultDTO { ResultCode = 1, Message = "Error" }); } return(new ResultDTO { ResultCode = 0, Message = "Success" }); }
/// <summary> /// 获取拼团详情 /// </summary> /// <param name="search"></param> /// <returns></returns> public Jinher.AMP.BTP.Deploy.CustomDTO.ResultDTO <Jinher.AMP.BTP.Deploy.CustomDTO.DiyGroupDetailDTO> GetDiyGroupDetailExt(Jinher.AMP.BTP.Deploy.CustomDTO.DiyGroupDetailSearchDTO search) { ResultDTO <Jinher.AMP.BTP.Deploy.CustomDTO.DiyGroupDetailDTO> result = new ResultDTO <DiyGroupDetailDTO>(); if (search == null || search.DiyGoupId == Guid.Empty) { result.ResultCode = 1; result.Message = "参数错误"; return(result); } var query = (from dg in DiyGroup.ObjectSet() join c in Commodity.ObjectSet() on dg.CommodityId equals c.Id join p in Promotion.ObjectSet() on dg.PromotionId equals p.Id where dg.Id == search.DiyGoupId select new { DiyGroup = dg, Commodity = c, Promotion = p }).FirstOrDefault(); if (query == null || query.Commodity == null || query.DiyGroup == null || query.Promotion == null) { result.ResultCode = 2; result.Message = "没有获取到相应的拼团详情"; return(result); } var commodity = query.Commodity; var diyGroup = query.DiyGroup; var promotion = query.Promotion; var promotionItem = PromotionItems.ObjectSet().Where(t => t.PromotionId == diyGroup.PromotionId).FirstOrDefault(); if (promotionItem == null) { result.ResultCode = 2; result.Message = "没有获取到相应的拼团详情"; return(result); } var productDetailPicture = ProductDetailsPicture.ObjectSet().Where(n => n.CommodityId == commodity.Id).OrderBy(n => n.Sort).Select(c => c.PicturesPath).FirstOrDefault(); result.Data = new DiyGroupDetailDTO() { Id = diyGroup.Id, Name = diyGroup.Name, Code = diyGroup.Code, SubTime = diyGroup.SubTime, SubId = diyGroup.SubId, AppId = diyGroup.AppId, CommodityId = diyGroup.CommodityId, PromotionId = diyGroup.PromotionId, ModifiedOn = diyGroup.ModifiedOn, ExpireTime = diyGroup.ExpireTime, State = diyGroup.State, JoinNumber = diyGroup.JoinNumber, SuccessProcessorId = diyGroup.SuccessProcessorId, SuccessTime = diyGroup.SuccessTime, FailProcessorId = diyGroup.FailProcessorId, FailTime = diyGroup.FailTime, EsAppId = diyGroup.EsAppId, //commodity PicturesPath = commodity.PicturesPath, CommodityName = commodity.Name, ProductDetailPicture = productDetailPicture, //promotion StartTime = promotion.StartTime, EndTime = promotion.EndTime, GroupMinVolume = promotion.GroupMinVolume ?? -1, ExpireSecond = promotion.ExpireSecond ?? -1, Description = promotion.Description, OutsideId = promotion.OutsideId.Value, //promotionitem LimitBuyEach = promotionItem.LimitBuyEach ?? -1, LimitBuyTotal = promotionItem.LimitBuyTotal ?? -1, DiscountPrice = promotionItem.DiscountPrice, SurplusLimitBuyTotal = promotionItem.SurplusLimitBuyTotal ?? -1 }; result.Data.DiyGroupOrderList = new List <DiyGroupOrderDetailDTO>(); var diyGroupOrder = (from dgOrder in DiyGroupOrder.ObjectSet() join co in CommodityOrder.ObjectSet() on dgOrder.OrderId equals co.Id where dgOrder.DiyGroupId == search.DiyGoupId && (dgOrder.Role == 0 || dgOrder.Role == 1 && dgOrder.State == 1) orderby dgOrder.SubTime ascending select new DiyGroupOrderDetailDTO { Id = dgOrder.Id, SubTime = dgOrder.SubTime, SubId = dgOrder.SubId, AppId = dgOrder.AppId, OrderId = dgOrder.OrderId, OrderCode = dgOrder.OrderCode, Role = dgOrder.Role, DiyGroupId = dgOrder.DiyGroupId, SubCode = dgOrder.SubCode, ModifiedOn = dgOrder.ModifiedOn, DiyGroupPrice = (decimal)co.RealPrice }).ToList(); result.Data.DiyGroupOrderList.AddRange(diyGroupOrder); //提取用户信息 var userIdList = result.Data.DiyGroupOrderList.Select(t => t.SubId).ToList(); var userInfolist = CBCSV.Instance.GetUserInfoWithAccountList(userIdList); if (userInfolist != null && userInfolist.Count > 0) { foreach (var item in result.Data.DiyGroupOrderList) { var tmpUserInfo = userInfolist.Where(t => t.UserId == item.SubId).FirstOrDefault(); if (tmpUserInfo != null) { item.UserCode = CBCSV.EncodeUserCode(tmpUserInfo.Account); item.UserPicture = tmpUserInfo.HeadIcon; } } } //var diyHeadOrder = diyGroupOrder.Where(t => t.Role == 0).FirstOrDefault(); //if (diyHeadOrder != null && diyHeadOrder.State == 0) //{ // result.Data.JoinNumber = result.Data.JoinNumber + 1; //} //系统当前时间,倒计时用 result.Data.DateTimeNow = DateTime.Now; return(result); }
/// <summary> /// 自动确认成团 -- JOB调用 /// </summary> /// <returns></returns> public Jinher.AMP.BTP.Deploy.CustomDTO.ResultDTO VoluntarilyConfirmDiyGroupExt() { try { ContextSession contextSession = ContextFactory.CurrentThreadContext; //获取所有组团成功,但是没有手动成团的拼团订单 var diyQuery = (from diy in DiyGroup.ObjectSet() join c in Commodity.ObjectSet() on diy.CommodityId equals c.Id join ps in PromotionItems.ObjectSet() on c.Id equals ps.CommodityId join p in Promotion.ObjectSet() on ps.PromotionId equals p.Id where diy.JoinNumber != 0 && diy.PromotionId == p.Id && diy.State == 2 select new DiyGroupManageVM { DiyId = diy.Id, AppId = diy.EsAppId }); diyQuery = diyQuery.Distinct(); List <DiyGroupConfig> list = new List <DiyGroupConfig>(); foreach (var diyGroupManageVm in diyQuery) { DiyGroupConfigCDTO diyGroupConfig; if (list.Count > 0 && list.Any(t => t.EsAppId == diyGroupManageVm.AppId)) { diyGroupConfig = list.FirstOrDefault(t => t.EsAppId == diyGroupManageVm.AppId).DiyGroupConfigCdto; } else { diyGroupConfig = TPS.ZPHSV.Instance.GetDiyGroupConfig(diyGroupManageVm.AppId); DiyGroupConfig diyGroupConfigBp = new DiyGroupConfig { EsAppId = diyGroupManageVm.AppId, DiyGroupConfigCdto = diyGroupConfig }; list.Add(diyGroupConfigBp); } if (diyGroupConfig.IsClustering) { var query = (from diyGroup in DiyGroup.ObjectSet() join diyGroupOrder in DiyGroupOrder.ObjectSet() on diyGroup.Id equals diyGroupOrder.DiyGroupId join order in CommodityOrder.ObjectSet() on diyGroupOrder.OrderId equals order.Id where diyGroup.Id == diyGroupManageVm.DiyId && diyGroupOrder.State == 1 && diyGroup.State == 2 select order ).ToList(); if (query.Count > 0) { foreach (var diyorder in query) { diyorder.State = 1; diyorder.ModifiedOn = DateTime.Now; diyorder.EntityState = System.Data.EntityState.Modified; contextSession.SaveObject(diyorder); Jinher.AMP.BTP.BE.BELogic.AddMessage addmassage = new Jinher.AMP.BTP.BE.BELogic.AddMessage(); addmassage.AddMessages(diyorder.Id.ToString(), diyorder.UserId.ToString(), diyorder.AppId, diyorder.Code, diyorder.State, "", "order"); // 触发订单成功事件 OrderEventHelper.OnOrderPaySuccess(diyorder); } } var diyquery = DiyGroup.ObjectSet().FirstOrDefault(n => n.Id == diyGroupManageVm.DiyId && n.EsAppId == diyGroupManageVm.AppId && n.State == 2); if (diyquery != null) { diyquery.State = 3; diyquery.ModifiedOn = DateTime.Now; diyquery.EntityState = EntityState.Modified; contextSession.SaveObject(diyquery); } } } contextSession.SaveChange(); } catch (Exception ex) { LogHelper.Error(string.Format("自动确认成团 -- JOB调用异常"), ex); return(new ResultDTO { ResultCode = 1, Message = "Error" }); } return(new ResultDTO { ResultCode = 0, Message = "Success" }); }
/// <summary> /// 我的拼团订单列表 /// </summary> /// <param name="search"></param> /// <returns></returns> public List <Jinher.AMP.BTP.Deploy.CustomDTO.DiyGroupOrderListDTO> GetDiyGroupListExt(Jinher.AMP.BTP.Deploy.CustomDTO.DiyGroupSearchDTO search) { List <Jinher.AMP.BTP.Deploy.CustomDTO.DiyGroupOrderListDTO> resultlist = new List <DiyGroupOrderListDTO>(); if (search == null) { return(resultlist); } search.PageIndex = search.PageIndex == 0 ? 1 : search.PageIndex; search.PageSize = search.PageSize == 0 ? 20 : search.PageSize; var diyList = (from diy in DiyGroup.ObjectSet() join pro in PromotionItems.ObjectSet() on diy.PromotionId equals pro.PromotionId join p in Promotion.ObjectSet() on pro.PromotionId equals p.Id join diyo in DiyGroupOrder.ObjectSet() on diy.Id equals diyo.DiyGroupId join com in CommodityOrder.ObjectSet() on diyo.OrderId equals com.Id where diy.EsAppId == search.EsAppId && com.UserId == search.UserId && diyo.State == 1 && diy.State != 0 orderby diyo.SubTime descending select new DiyGroupOrderListDTO { Price = com.RealPrice, DiyGroupPrice = pro.DiscountPrice, SubTime = diyo.SubTime, DiyGroupState = diy.State, GroupMinVolume = p.GroupMinVolume ?? -1, JoinNumber = diy.JoinNumber, DiyGroupId = diy.Id, EsAppId = diy.EsAppId, OrderId = diyo.OrderId, DiyOrderSubTime = diyo.SubTime, ModifiedOn = diyo.ModifiedOn, EndTime = p.EndTime }).Skip((search.PageIndex - 1) * search.PageSize).Take(search.PageSize).ToList(); var diyorderIds = diyList.Select(n => n.OrderId).ToList(); if (diyList.Any()) { var diyorderList = (from ord in OrderItem.ObjectSet() where diyorderIds.Contains(ord.CommodityOrderId) select new DiyGroupManageMM { Pic = ord.PicturesPath, Name = ord.Name, DiyNumber = ord.Number, DiyGroupOrderId = ord.CommodityOrderId, attributes = ord.CommodityAttributes }).ToList(); Dictionary <Guid, List <DiyGroupManageMM> > csdtoList = diyorderList.GroupBy(c => c.DiyGroupOrderId, (key, group) => new { DiyGroupOrderId = key, CommodityList = group }) .ToDictionary(c => c.DiyGroupOrderId, c => c.CommodityList.ToList()); var listAppIds = (from co in diyList select co.EsAppId).Distinct().ToList(); Dictionary <Guid, string> dictAppName = APPSV.GetAppNameListByIds(listAppIds); foreach (var diyGroupOrder in diyList) { if (csdtoList.ContainsKey(diyGroupOrder.OrderId)) { var commodityDtoList = csdtoList[diyGroupOrder.OrderId]; diyGroupOrder.OrderDataList = commodityDtoList; } if (dictAppName != null && dictAppName.Count > 0 && dictAppName.ContainsKey(diyGroupOrder.EsAppId)) { var appNameDto = dictAppName[diyGroupOrder.EsAppId]; diyGroupOrder.AppName = appNameDto; } resultlist.Add(diyGroupOrder); } } return(resultlist); }
/// <summary> /// 更新活动 /// </summary> public ResultDTO UpdatePromotionExt(PresentPromotionCreateDTO input) { if (input.Id == Guid.Empty) { return(new ResultDTO { isSuccess = false, Message = "参数错误" }); } if (input.Commodities == null || input.Commodities.Count == 0) { return(new ResultDTO { isSuccess = false, Message = "请选择主商品" }); } if (input.Gifts == null || input.Gifts.Count == 0) { return(new ResultDTO { isSuccess = false, Message = "请选择赠品" }); } var comIds = input.Commodities.Select(_ => _.CommodityId); // 检查活动是否冲突 // 该商品正在参与XX(秒杀、预约、预售、拼团、限时打折、赠品促销、套餐促销)活动,请更换商品或者更改活动时间 var prop = (from item in PromotionItems.ObjectSet() join pro in Promotion.ObjectSet() on item.PromotionId equals pro.Id where !pro.IsDel && (comIds.Contains(item.CommodityId) && pro.EndTime >= input.BeginTime && pro.StartTime <= input.EndTime) select pro).FirstOrDefault(); if (prop != null) { var propName = "限时打折"; switch (prop.PromotionType) { case 1: propName = "秒杀"; break; case 2: propName = "预约"; break; case 3: propName = "拼团"; break; case 5: propName = "预售"; break; } return(new ResultDTO { isSuccess = false, Message = "该商品正在参与" + propName + "活动,请更换商品或者更改活动时间" }); } var ppCount = PresentPromotionCommodity.ObjectSet().Where(_ => comIds.Contains(_.CommodityId)).Join(PresentPromotion.ObjectSet().Where(p => p.Id != input.Id && p.EndTime >= input.BeginTime && p.BeginTime <= input.EndTime), pc => pc.PresentPromotionId, p => p.Id, (pc, p) => 1).Count(); if (ppCount > 0) { return(new ResultDTO { isSuccess = false, Message = "该商品正在参与赠品促销活动,请更换商品或者更改活动时间" }); } ContextSession contextSession = ContextFactory.CurrentThreadContext; try { var presentPromotion = PresentPromotion.FindByID(input.Id); if (presentPromotion == null) { return(new ResultDTO { isSuccess = false, Message = "参数错误" }); } var now = DateTime.Now; if (presentPromotion.IsEnd || now > presentPromotion.EndTime) { return(new ResultDTO { isSuccess = false, Message = "活动已结束" }); } if (presentPromotion.BeginTime < now && now < presentPromotion.EndTime) { return(new ResultDTO { isSuccess = false, Message = "活动已开始" }); } //presentPromotion.AppId = input.AppId; //presentPromotion.UserId = ContextDTO.LoginUserID; presentPromotion.Name = input.Name; presentPromotion.BeginTime = input.BeginTime; presentPromotion.EndTime = input.EndTime; presentPromotion.Limit = input.Limit; presentPromotion.IsEnd = false; contextSession.SaveObject(presentPromotion); foreach (var item in PresentPromotionCommodity.ObjectSet().Where(_ => _.PresentPromotionId == presentPromotion.Id)) { item.EntityState = System.Data.EntityState.Deleted; contextSession.SaveObject(item); } foreach (var item in PresentPromotionGift.ObjectSet().Where(_ => _.PresentPromotionId == presentPromotion.Id)) { item.EntityState = System.Data.EntityState.Deleted; contextSession.SaveObject(item); } foreach (var item in input.Commodities) { PresentPromotionCommodity ppc = PresentPromotionCommodity.CreatePresentPromotionCommodity(); ppc.PresentPromotionId = presentPromotion.Id; ppc.AppId = input.AppId; ppc.UserId = ContextDTO.LoginUserID; ppc.CommodityId = item.CommodityId; ppc.CommodityCode = item.Code; ppc.CommodityName = item.Name; ppc.CommoditySKUId = item.SKUId; ppc.CommoditySKU = item.SKUName; ppc.CommoditySKUCode = item.SKUCode; ppc.CommodityPrice = item.Price; ppc.Limit = item.Limit; contextSession.SaveObject(ppc); } foreach (var item in input.Gifts) { PresentPromotionGift ppg = PresentPromotionGift.CreatePresentPromotionGift(); ppg.PresentPromotionId = presentPromotion.Id; ppg.AppId = input.AppId; ppg.UserId = ContextDTO.LoginUserID; ppg.CommodityId = item.CommodityId; ppg.CommodityCode = item.Code; ppg.CommodityName = item.Name; ppg.CommoditySKUId = item.SKUId; ppg.CommoditySKU = item.SKUName; ppg.CommoditySKUCode = item.SKUCode; ppg.CommodityPrice = item.Price; ppg.Number = item.Limit; contextSession.SaveObject(ppg); } contextSession.SaveChange(); } catch (Exception ex) { LogHelper.Error("PresentPromotionBPExt.CreatePromotionExt 异常", ex); return(new Jinher.AMP.BTP.Deploy.CustomDTO.ResultDTO { isSuccess = false, Message = ex.Message }); } return(new Jinher.AMP.BTP.Deploy.CustomDTO.ResultDTO { isSuccess = true }); }
/// <summary> /// 发布活动 /// </summary> public ResultDTO CreatePromotionExt(PresentPromotionCreateDTO input) { if (input.Commodities == null || input.Commodities.Count == 0) { return(new ResultDTO { isSuccess = false, Message = "请选择主商品" }); } if (input.Gifts == null || input.Gifts.Count == 0) { return(new ResultDTO { isSuccess = false, Message = "请选择赠品" }); } var comIds = input.Commodities.Select(_ => _.CommodityId); // 检查活动是否冲突 // 该商品正在参与XX(秒杀、预约、预售、拼团、限时打折、赠品促销、套餐促销)活动,请更换商品或者更改活动时间 var prop = (from item in PromotionItems.ObjectSet() join pro in Promotion.ObjectSet() on item.PromotionId equals pro.Id where !pro.IsDel && (comIds.Contains(item.CommodityId) && pro.EndTime >= input.BeginTime && pro.StartTime <= input.EndTime) select pro).FirstOrDefault(); if (prop != null) { var propName = "限时打折"; switch (prop.PromotionType) { case 1: propName = "秒杀"; break; case 2: propName = "预约"; break; case 3: propName = "拼团"; break; case 5: propName = "预售"; break; } Jinher.AMP.ZPH.ISV.Facade.CommodityFacade facadeCheck = new Jinher.AMP.ZPH.ISV.Facade.CommodityFacade(); foreach (var item in comIds) { Jinher.AMP.ZPH.Deploy.CustomDTO.CheckComdtyActInSameTimeCDTO dto = new ZPH.Deploy.CustomDTO.CheckComdtyActInSameTimeCDTO() { comdtyId = item, startTime = input.BeginTime, endTime = input.EndTime }; Jinher.AMP.ZPH.Deploy.CustomDTO.ReturnInfo requst = facadeCheck.CheckComdtyActInSameTime(dto); if (requst.Message.Contains("套装")) { propName = "套装"; break; } } return(new ResultDTO { isSuccess = false, Message = "该商品正在参与" + propName + "活动,请更换商品或者更改活动时间" }); } var ppCount = PresentPromotionCommodity.ObjectSet().Where(_ => comIds.Contains(_.CommodityId)).Join(PresentPromotion.ObjectSet().Where(p => !p.IsEnd && p.EndTime >= input.BeginTime && p.BeginTime <= input.EndTime), pc => pc.PresentPromotionId, p => p.Id, (pc, p) => 1).Count(); if (ppCount > 0) { return(new ResultDTO { isSuccess = false, Message = "该商品正在参与赠品促销活动,请更换商品或者更改活动时间" }); } ContextSession contextSession = ContextFactory.CurrentThreadContext; var presentPromotion = PresentPromotion.CreatePresentPromotion(); presentPromotion.AppId = input.AppId; presentPromotion.UserId = ContextDTO.LoginUserID; presentPromotion.Name = input.Name; presentPromotion.BeginTime = input.BeginTime; presentPromotion.EndTime = input.EndTime; presentPromotion.Limit = input.Limit; presentPromotion.IsEnd = false; contextSession.SaveObject(presentPromotion); foreach (var item in input.Commodities) { PresentPromotionCommodity ppc = PresentPromotionCommodity.CreatePresentPromotionCommodity(); ppc.PresentPromotionId = presentPromotion.Id; ppc.AppId = input.AppId; ppc.UserId = ContextDTO.LoginUserID; ppc.CommodityId = item.CommodityId; ppc.CommodityCode = item.Code; ppc.CommodityName = item.Name; ppc.CommoditySKUId = item.SKUId; ppc.CommoditySKU = item.SKUName; ppc.CommoditySKUCode = item.SKUCode; ppc.CommodityPrice = item.Price; ppc.Limit = item.Limit; contextSession.SaveObject(ppc); } foreach (var item in input.Gifts) { PresentPromotionGift ppg = PresentPromotionGift.CreatePresentPromotionGift(); ppg.PresentPromotionId = presentPromotion.Id; ppg.AppId = input.AppId; ppg.UserId = ContextDTO.LoginUserID; ppg.CommodityId = item.CommodityId; ppg.CommodityCode = item.Code; ppg.CommodityName = item.Name; ppg.CommoditySKUId = item.SKUId; ppg.CommoditySKU = item.SKUName; ppg.CommoditySKUCode = item.SKUCode; ppg.CommodityPrice = item.Price; ppg.Number = item.Limit; contextSession.SaveObject(ppg); } try { contextSession.SaveChange(Jinher.JAP.Common.SaveExceptionEnum.BF); } catch (Exception ex) { LogHelper.Error("PresentPromotionBPExt.CreatePromotionExt 异常", ex); return(new Jinher.AMP.BTP.Deploy.CustomDTO.ResultDTO { isSuccess = false, Message = ex.Message }); } return(new Jinher.AMP.BTP.Deploy.CustomDTO.ResultDTO { isSuccess = true }); }
/// <summary> /// 获取拼团信息(必传参数AppId、PageIndex、PageSize、State,可选参数ComNameSub) /// </summary> /// <param name="search"></param> /// <returns></returns> public Jinher.AMP.BTP.Deploy.CustomDTO.ResultDTO <Jinher.AMP.BTP.Deploy.CustomDTO.DiyGroupManageDTO> GetDiyGroupsExt(Jinher.AMP.BTP.Deploy.CustomDTO.DiyGroupSearchDTO search) { Jinher.AMP.BTP.Deploy.CustomDTO.ResultDTO <Jinher.AMP.BTP.Deploy.CustomDTO.DiyGroupManageDTO> result = new ResultDTO <DiyGroupManageDTO>(); if (search == null) { result.Message = "参数错误,appId不能为空!"; result.ResultCode = 1; return(result); } var resultData = new Jinher.AMP.BTP.Deploy.CustomDTO.DiyGroupManageDTO(); var diyQuery = (from diy in DiyGroup.ObjectSet() join c in Commodity.ObjectSet() on diy.CommodityId equals c.Id join ps in PromotionItems.ObjectSet() on c.Id equals ps.CommodityId join p in Promotion.ObjectSet() on ps.PromotionId equals p.Id where c.AppId == search.AppId && diy.State != 0 && diy.JoinNumber != 0 && diy.PromotionId == p.Id select new DiyGroupManageVM { DiyGroupNumber = diy.Code, DiyGroupName = c.Name, DiyGroupPrice = ps.DiscountPrice, DiyGroupCount = p.GroupMinVolume, DiyId = diy.Id, DiyGroupSubTime = diy.SubTime, DiyGroupState = diy.State }); if (!String.IsNullOrEmpty(search.ComNameSub)) { diyQuery = diyQuery.Where(c => c.DiyGroupName.Contains(search.ComNameSub)); } if (!String.IsNullOrEmpty(search.State)) { if (search.State.Contains(",")) { int[] arrystate = Array.ConvertAll <string, int>(search.State.Split(','), s => int.Parse(s)).ToArray(); diyQuery = diyQuery.Where(c => arrystate.Contains(c.DiyGroupState)); } else { diyQuery = diyQuery.Where(c => c.DiyGroupState == 1); } } else if (search.State == "") { } diyQuery = diyQuery.Distinct(); resultData.Count = diyQuery.Count(); var searchResult = diyQuery.OrderByDescending(c => c.DiyGroupNumber).Skip((search.PageIndex - 1) * search.PageSize).Take(search.PageSize).ToList(); var diygroupIdList = searchResult.Select(c => c.DiyId).ToList(); //构建拼团订单id数组 List <Guid> diyOrderIdList = new List <Guid>(); for (int i = 0; i < searchResult.Count; i++) { diyOrderIdList.Add(searchResult[i].DiyId); } List <DiyGroupManageMM> diyGroupManageMmList = (from diyo in DiyGroupOrder.ObjectSet() join co in CommodityOrder.ObjectSet() on diyo.OrderId equals co.Id where diyo.AppId == search.AppId && diygroupIdList.Contains(diyo.DiyGroupId) && diyo.State == 1 select new DiyGroupManageMM { DiyGroupOrderCode = diyo.OrderCode, DiyGroupPersonCode = diyo.SubCode, DiyGroupPersonRole = diyo.Role, DiyGroupOrderId = diyo.OrderId, DiyGroupId = diyo.DiyGroupId, DiyGroupPrice = (decimal)co.RealPrice } ).OrderBy(c => c.DiyGroupOrderCode).ToList(); foreach (DiyGroupManageVM vm in searchResult) { List <DiyGroupManageMM> diyorderItemslist = new List <DiyGroupManageMM>(); foreach (DiyGroupManageMM model in diyGroupManageMmList) { if (model.DiyGroupId == vm.DiyId) { diyorderItemslist.Add(model); } } vm.OrderDataList = diyorderItemslist; } resultData.Data = searchResult; result.Data = resultData; return(result); }
public Deploy.CustomDTO.ResultDTO <SearchCommodityByFreightTemplateOutputDTO> GetCommodityByFreightTemplateExt(SearchCommodityByFreightTemplateInputDTO inputDTO) { if (inputDTO == null) { throw new ArgumentNullException(); } var appId = inputDTO.AppId; var templateId = inputDTO.TemplateId; var showAssociated = inputDTO.ShowAssociated; var commodityName = inputDTO.CommodityName; var takeCount = inputDTO.PageSize; var skipCount = inputDTO.PageIndex > 0 ? --inputDTO.PageIndex * takeCount : 0; var defaultTemplateId = Guid.Empty; var joinPromotion = inputDTO.JoinPromotion; var query = Commodity.ObjectSet().Where(predicate => predicate.AppId == appId && (showAssociated ? predicate.FreightTemplateId == templateId : (predicate.FreightTemplateId == null || predicate.FreightTemplateId == defaultTemplateId)) && (!string.IsNullOrEmpty(commodityName) ? predicate.Name.Contains(commodityName) : true)); if (!showAssociated && joinPromotion) { //过滤出搞活动的商品 query = from commodity in query join promo in Promotion.ObjectSet() on commodity.AppId equals promo.AppId into cpcontainer from promo in cpcontainer.DefaultIfEmpty() join promoItem in PromotionItems.ObjectSet() on new { promoId = promo.Id, commodityId = commodity.Id } equals new { promoId = promoItem.PromotionId, commodityId = promoItem.CommodityId } where promo.StartTime >= DateTime.Now && promo.EndTime <= DateTime.Now select commodity; } var total = query.Count(); var list = query.OrderBy(selector => selector.SubTime).Skip(skipCount).Take(takeCount).Select(selector => new ComdtyList4SelCDTO { Id = selector.Id, Name = selector.Name, Pic = selector.PicturesPath, Price = selector.Price, Stock = selector.Stock }).ToList(); var outputDTO = new ResultDTO <SearchCommodityByFreightTemplateOutputDTO> { Data = new SearchCommodityByFreightTemplateOutputDTO { Total = total, Commodities = list }, isSuccess = true, ResultCode = 0 }; return(outputDTO); }