/// <summary>
        /// 描述:报名时使用优惠券,并修改优惠券状态
        /// <para>作    者:瞿琦</para>
        /// <para>创建时间:2018-11-24</para>
        /// </summary>
        /// <param name="couponIdList">优惠券Id集合</param>
        /// <param name="enrollOrderId">报名订单Id</param>
        /// <param name="tblDctCouponRepository">优惠券仓储</param>
        /// <returns>使用的满减和转介绍的优惠券集合</returns>
        /// <exception cref="AMS.Core.BussinessException">
        /// 异常ID:13, 异常描述:全免时不可选择多张优惠券
        /// </exception>
        private List <CouponGenerateResponse> UseCoupon(List <long> couponIdList, long enrollOrderId, TblDctCouponRepository tblDctCouponRepository)
        {
            //此方法其实只有转介绍和校长奖学金两种优惠券进来,满减在另外一个方法
            var result = new List <CouponGenerateResponse>();

            if (!couponIdList.Any())
            {
                return(result);
            }

            //优惠券ID集合不为空,则使用优惠券
            var couponInfoList = tblDctCouponRepository.GetCouponInfo(couponIdList).Result;

            //有使用全免优惠券时,不可选择多张优惠券
            if (couponInfoList.Count > 1 && couponInfoList.Any(x => x.CouponType == (int)CouponType.HeadmasterBonus && x.IsFreeAll))
            {
                throw new BussinessException(ModelType.Discount, 13);
            }

            var fullReduceOrRecommendList = new List <long>(); //满减或者转介绍优惠券Id集合
            var headmasterBonusList       = new List <long>(); //校长奖学金优惠券Id集合

            foreach (var item in couponInfoList)
            {
                switch (item.CouponType)
                {
                case (int)CouponType.FullReduce:      //满减或者转介绍
                    fullReduceOrRecommendList.Add(item.CouponId);
                    break;

                case (int)CouponType.Recommend:
                    fullReduceOrRecommendList.Add(item.CouponId);
                    break;

                //校长奖学金需重新绑定订单Id
                case (int)CouponType.HeadmasterBonus:
                    if (item.IsFreeAll)      //校长奖学金是全免的时候则减免全部学费
                    {
                        item.Amount = this._totalAmount;
                        _IsFreeAll  = true;
                    }
                    headmasterBonusList.Add(item.CouponId);
                    break;
                }
                var entity = new CouponGenerateResponse
                {
                    CouponId         = item.CouponId,
                    CouponRuleAmount = item.Amount,    //校长奖学金是全免的时候则减免全部学费
                    CouponType       = (CouponType)item.CouponType
                };
                result.Add(entity);
            }

            tblDctCouponRepository.UpdateCouponAsync(fullReduceOrRecommendList, Dto.Enum.CouponStatus.HasUse, DateTime.Now, enrollOrderId).Wait();
            tblDctCouponRepository.UpdateCouponAsync(headmasterBonusList, Dto.Enum.CouponStatus.HasUse, DateTime.Now, enrollOrderId).Wait();   //使用校长奖学金时需要绑定订单Id

            return(result);
        }
        /// <summary>
        /// 描述:添加转介绍优惠券,并修改优惠券的状态
        /// <para>作    者:瞿琦</para>
        /// <para>创建时间:2019-1-10</para>
        /// </summary>
        /// <param name="useCouponList">已使用的优惠券信息集合</param>
        /// <param name="enrollStudentId">报名学生Id</param>
        /// <param name="recommendStudentId">转介绍人Id(没有转介绍时为空)</param>
        /// <param name="recommendCouponRuleId">转介绍的规则Id(没有勾选时传空)</param>
        /// <param name="enrollOrderId">订单表主键</param>
        /// <param name="tblDctCouponRepository">优惠券表仓储</param>
        /// <param name="tblDctCouponRuleRepository">优惠信息规则表仓储</param>
        /// <returns>已使用的转介绍优惠券集合</returns>
        /// <exception cref="AMS.Core.BussinessException">
        /// 异常ID:15, 异常描述:该转介绍奖学金信息不存在
        /// </exception>
        private List <CouponGenerateResponse> OperationRecommendCoupon(List <CouponGenerateResponse> useCouponList, long enrollStudentId, long?recommendStudentId, long?recommendCouponRuleId, long enrollOrderId, TblDctCouponRepository tblDctCouponRepository, TblDctCouponRuleRepository tblDctCouponRuleRepository)
        {
            if (recommendStudentId.HasValue && recommendStudentId > 0)   //介绍人不为空时才有转介绍优惠
            {
                var couponRuleService = new CouponRuleService(this._schoolId);
                TblDctCouponRule recommendRuleModel;
                if (recommendCouponRuleId.HasValue && recommendCouponRuleId > 0)  //如果报名页面勾选转介绍 ,则根据id查询转介绍信息
                {
                    recommendRuleModel = couponRuleService.GetCouponRuleIdByRuleList(recommendCouponRuleId.Value);
                    if (recommendRuleModel == null)
                    {
                        throw new BussinessException(ModelType.Discount, 15);
                    }
                }
                else //如果报名页面没有勾选转介绍 ,则获取本校区转介绍最新优惠信息
                {
                    recommendRuleModel = couponRuleService.GetTblDctCouponRuleInfo();
                }

                if (recommendRuleModel != null)                                                                                                                                                  //为空代表没有转介绍优惠,有转介绍的话则添加两张优惠券
                {
                    var enrollStuCouponId = AddCouponInfo(recommendRuleModel, enrollStudentId, CouponType.Recommend, enrollOrderId, Dto.Enum.CouponStatus.NoUse, tblDctCouponRepository).Result; //同时添加2张优惠券
                    AddCouponInfo(recommendRuleModel, recommendStudentId.Value, CouponType.Recommend, enrollOrderId, Dto.Enum.CouponStatus.NoUse, tblDctCouponRepository).Wait();

                    recommendRuleModel.UseQuota = recommendRuleModel.UseQuota + 2;
                    tblDctCouponRuleRepository.Update(recommendRuleModel);   //修改使用人数

                    LogWriter.Write(this, "测试转介绍:" + recommendCouponRuleId);
                    if (recommendCouponRuleId.HasValue && recommendCouponRuleId > 0)                                                          //转介绍规则Id不为空,则使用该优惠券
                    {
                        tblDctCouponRepository.UpdateCouponAsync(enrollStuCouponId, Dto.Enum.CouponStatus.HasUse, DateTime.Now, null).Wait(); //将当前报名学生的优惠券使用掉 修改优惠券状态
                        var recommendRuleEntity = new CouponGenerateResponse
                        {
                            CouponId         = enrollStuCouponId,
                            CouponRuleAmount = recommendRuleModel.CouponAmount,
                            CouponType       = CouponType.Recommend
                        };
                        useCouponList.Add(recommendRuleEntity);
                    }
                }
            }
            return(useCouponList);
        }
        /// <summary>
        /// 描述:预览生成优惠数据(满减金额+转介绍)
        /// <para>作    者:瞿琦</para>
        /// <para>创建时间:2018-11-2</para>
        /// </summary>
        /// <param name="studentId">学生Id</param>
        /// <returns>优惠信息集合</returns>

        public async Task <List <CouponGenerateResponse> > Peek(long studentId)
        {
            var result = new List <CouponGenerateResponse>();

            //1.满减信息
            var resultFullReduce = new CouponGenerateResponse();
            //获取赠与奖学金金额
            var query = (await _tblDctCouponRuleRepository.Value.GetAmountByCouponRule(_schoolId, _totalAmount)).FirstOrDefault();

            resultFullReduce.CouponRuleId     = query?.CouponRuleId ?? 0;
            resultFullReduce.CouponRuleAmount = query?.CouponAmount ?? 0;
            resultFullReduce.CouponType       = CouponType.FullReduce;
            result.Add(resultFullReduce);

            //2.转介绍信息
            //获取学生是否有转介绍Id
            var studentService = new StudentService(_schoolId);
            var studenInfo     = studentService.GetStudent(studentId);
            //获取学生是否有报名信息
            var enrollOrderService = new EnrollOrderService(_schoolId);
            var studentOrder       = enrollOrderService.GetStudentOrders(studentId).Result;

            if (!studentOrder.Any()) //没有报过名,并且有转介绍人 才返回转介绍信息
            {
                if (studenInfo.ParentId <= 0)
                {
                    return(result);
                }

                var couponRuleService = new CouponRuleService(_schoolId);
                var couponRuleResult  = couponRuleService.GetTblDctCouponRuleInfo();

                var resultRecommend = new CouponGenerateResponse
                {
                    CouponRuleId     = couponRuleResult?.CouponRuleId ?? 0,
                    CouponRuleAmount = couponRuleResult?.CouponAmount ?? 0,
                    CouponType       = CouponType.Recommend
                };
                result.Add(resultRecommend);
            }
            return(result);
        }
        /// <summary>
        /// 描述:使用满减优惠,并添加优惠券表数据
        /// <para>作    者:瞿琦</para>
        /// <para>创建时间:2018-11-24</para>
        /// </summary>
        /// <param name="fullCouponRulId">满减规则Id</param>
        /// <param name="useCouponList">已使用的优惠券信息集合</param>
        /// <param name="enrollStudentId">报名学生Id</param>
        /// <param name="enrollOrderId">订单表主键</param>
        /// <param name="tblDctCouponRepository">优惠券表仓储</param>
        /// <param name="tblDctCouponRuleRepository">优惠信息规则表仓储</param>
        /// <returns>使用的满减优惠券的集合</returns>
        /// <exception cref="AMS.Core.BussinessException">
        /// 异常ID:16, 异常描述:该满减奖学金信息不存在
        /// </exception>
        private List <CouponGenerateResponse> OperationFullReduceCoupon(long?fullCouponRulId, List <CouponGenerateResponse> useCouponList, long enrollStudentId, long enrollOrderId, TblDctCouponRepository tblDctCouponRepository, TblDctCouponRuleRepository tblDctCouponRuleRepository)
        {
            //使用满减优惠
            if (!fullCouponRulId.HasValue || fullCouponRulId <= 0)
            {
                return(useCouponList);
            }
            var query = tblDctCouponRuleRepository.GetCouponRuleIdByRuleList(fullCouponRulId.Value).Result;

            if (query == null)  //如果满减不存在
            {
                throw new BussinessException(ModelType.Discount, 16);
            }
            //优惠券不能过期
            var currentDate = DateTime.Now;

            if (query.IsDisabled == false && ((query.MaxQuota > 0 && query.UseQuota < query.MaxQuota) || query.MaxQuota == 0) && query.BeginDate <= currentDate && currentDate <= query.EndDate.AddDays(1))
            {
                //添加优惠券并修改使用人数
                var fullReduceId = this.AddCouponInfo(query, enrollStudentId, CouponType.FullReduce, enrollOrderId, Dto.Enum.CouponStatus.HasUse, tblDctCouponRepository).Result;   //添加满减优惠券

                query.UseQuota = query.UseQuota + 1;
                tblDctCouponRuleRepository.Update(query);  //修改使用人数

                var fullReduceEntity = new CouponGenerateResponse
                {
                    CouponId         = fullReduceId,
                    CouponRuleAmount = query.CouponAmount,
                    CouponType       = CouponType.FullReduce
                };
                useCouponList.Add(fullReduceEntity);
            }
            else
            {
                throw new BussinessException(ModelType.Discount, 16);
            }
            return(useCouponList);
        }