/// <summary> /// 使用優惠券 /// </summary> /// <param name="order">訂單</param> public virtual void Use(IOrder order) { if (!IsAvailable(order)) { return; } var couponItem = new CouponOrderItem() { Name = Name, Price = 0, Count = 1, Coupon = this }; var amount = order.TotalAmount; if (AllowReuse) { var discount = (100 - DiscountPercent) / 100m; // amount * discount ^ count = Threshold // discount ^ count = Threshold / amount; // log_(Threshold / amount) discount = count var count = Convert.ToUInt32(Math.Ceiling( Math.Log(decimal.ToDouble(Threshold / amount), decimal.ToDouble(discount)) )); if (Count.HasValue) { count = Convert.ToUInt32(Math.Min(count, Count.Value)); } couponItem.Price = amount - new decimal(Math.Pow(decimal.ToDouble(discount), count)) * amount; couponItem.Price *= -1; #region 使用並扣除數量 if (Count.HasValue) { Count -= count; } order.Items.Add(couponItem); UsedOrder.Add(order); #endregion } else { couponItem.Price = amount * DiscountPercent / 100m; couponItem.Price *= -1; #region 使用並扣除數量 Count -= 1; order.Items.Add(couponItem); UsedOrder.Add(order); #endregion } }
/// <summary> /// 使用優惠券 /// </summary> /// <param name="order">訂單</param> public void Use(IOrder order) { // 合併項目 Cashier.MergeOrderItem <TOrderItemIdentifier>(order); while (IsAvailable(order)) { // 適用於此優惠券項目 var setItems = order.Items .Where(x => x is IOrderItem <TOrderItemIdentifier> item && Set.Keys.Contains(item.Id) ) .Cast <IOrderItem <TOrderItemIdentifier> >(); // 查詢目前占用 var occupy = Cashier.GetTotalOccupyOrderItemCount(order); // 取得目前已經使用的項目 CouponOrderItem couponOrderItem = order.Items.SingleOrDefault(x => x is CouponOrderItem item && item.Coupon == this) as CouponOrderItem; // 如果沒有則加入 if (couponOrderItem == null) { couponOrderItem = new CouponOrderItem() { Coupon = this, Name = Name, Price = -DiscountPrice }; order.Items.Add(couponOrderItem); } // 累計 couponOrderItem.Count++; // 更新占用項目 foreach (var item in setItems) { if (!couponOrderItem.OccupyOrderItemCount.ContainsKey(item)) { couponOrderItem.OccupyOrderItemCount[item] = 0; } couponOrderItem.OccupyOrderItemCount[item] += Set[item.Id]; } } }
/// <summary> /// 使用優惠券 /// </summary> /// <param name="order">訂單</param> public override void Use(IOrder order) { // 合併項目 Cashier.MergeOrderItem <TOrderItemIdentifier>(order); foreach (var orderItem in order.Items.ToArray()) { if (IsAvailable(order, orderItem) && orderItem is IOrderItem <TOrderItemIdentifier> item) { var totalOccupy = Cashier.GetTotalOccupyOrderItemCount(order); var thisItemUsedCouponCount = totalOccupy.ContainsKey(item) ? totalOccupy[item].Sum(x => x.Value) : 0; var count = item.Count - (uint)thisItemUsedCouponCount; if (Count.HasValue) { count = Math.Min(Count.Value, count); } var couponItem = new CouponOrderItem() { Coupon = this, Name = Name, Price = -DiscountPrice, Count = count }; couponItem.OccupyOrderItemCount[item] = count; if (Count.HasValue) { Count -= couponItem.Count; } order.Items.Add(couponItem); } } }