/// <summary> /// 產生指定的PointTransactionDetail /// </summary> /// <param name="point">分數</param> /// <param name="transactionDate">此分數交易日期</param> /// <param name="expireDate">分數到期日</param> /// <returns></returns> public PointTransactionDetail CreatePointDetail(decimal point, DateTime?transactionDate = null, DateTime?expireDate = null) { PointTransactionDetail transactionDetail = new PointTransactionDetail(); transactionDetail.Point = point; if (transactionDate != null) { transactionDetail.TransactionDateTime = transactionDate.Value; } if (expireDate != null) { transactionDetail.ExprieDate = expireDate.Value; } return(transactionDetail); }
/// <summary> /// 抵銷分數。不論是扣除現有正分、或是抵銷現有負分 /// </summary> /// <param name="currentPoint"></param> private void OffsetPoint(PointTransactionDetail currentPoint) { //現在這個的交易日>queue的第一個分數的到期日 var IsExpired = currentPoint.TransactionDateTime > _pointsInQueue[0].ExprieDate; if (IsExpired) { _pointsInQueue.RemoveAt(0); OffsetPoint(currentPoint); } else { var pointGap = Math.Abs(_pointsInQueue[0].Point.Value) - Math.Abs(currentPoint.Point.Value); if (pointGap > 0) { //分數夠用直接用掉,更新第一個的分數 _pointsInQueue[0].Point += currentPoint.Point; } else if (pointGap == 0) { //分數剛好扣完,直接把紀錄抵銷 _pointsInQueue.RemoveAt(0); } else { //分數不夠扣,先算還剩多少分要扣,第一個再拿掉 currentPoint.Point += _pointsInQueue[0].Point; _pointsInQueue.RemoveAt(0); //如果分數還有再扣第二個 if (_pointsInQueue.Count != 0) { OffsetPoint(currentPoint); } else { _pointsInQueue.Add(currentPoint); } } } }
private void AccumulatePoint(PointTransactionDetail pointTransactionDetail) { bool isAdd = false; for (int i = 0; i < _pointsInQueue.Count; i++) { //比較到期日,新資料的到期日較早,則放前面 if (_pointsInQueue[i].ExprieDate > pointTransactionDetail.ExprieDate) { _pointsInQueue.Insert(i, pointTransactionDetail); isAdd = true; break; }//到期日同一天 else if (_pointsInQueue[i].ExprieDate > pointTransactionDetail.ExprieDate && _pointsInQueue[i].CreateDateTime > pointTransactionDetail.CreateDateTime) { } } if (!isAdd) { _pointsInQueue.Add(pointTransactionDetail); } }