Beispiel #1
0
        /// <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);
            }
        }