Esempio n. 1
0
        /// <summary>
        /// 根据学生ID、父阶段英文名,从数据库返回StudentApplyStageWrap
        /// </summary>
        /// <param name="studentID"></param>
        /// <param name="parentNameEn"></param>
        /// <returns></returns>
        public StudentApplyStageWrap GetStudentApplyStageWrapItem(string studentID, string parentNameEn)
        {
            if (!IsGuidStringValid(studentID))
            {
                return(null);
            }

            Guid _StudentID = new Guid(studentID);
            StudentApplyStageEntity parentStage = repository.StudentApplyStage.FirstOrDefault(s => s.StudentID == _StudentID && s.StageNameEn == parentNameEn);

            return(new StudentApplyStageWrap
            {
                ParentStage = parentStage,
                ChildStages = repository.StudentApplyStage
                              .Where(s => s.StudentID == _StudentID && s.ParentNo == parentStage.StageNo)
                              .OrderBy(s => s.StageNo)
                              .ToList()
            });
        }
Esempio n. 2
0
        /// <summary>
        /// 开始新的申请期
        /// </summary>
        /// <param name="parentStageNo"></param>
        /// <param name="studentID"></param>
        public void StartParentStage(int parentStageNo, Guid studentID)
        {
            List <StudentApplyStageEntity>        resultList  = new List <StudentApplyStageEntity>();
            StudentApplyStageEntity               parentStage = repository.StudentApplyStage.SingleOrDefault(s => s.StudentID == studentID && s.StageNo == parentStageNo);
            IEnumerable <StudentApplyStageEntity> childStages = repository.StudentApplyStage.Where(s => s.StudentID == studentID && s.ParentNo == parentStageNo);

            if (parentStage == null)
            {
                return;
            }

            parentStage.Percentage    = 1;
            parentStage.CurrentOption = parentStage.BeginOption;
            resultList.Add(parentStage);

            //如果子阶段无时间限制,则所有子阶段Percentage 均设为1
            //否则,仅设置第一个子阶段的Percentage 为1
            if (parentStage.IsDateSameWithParent)
            {
                foreach (StudentApplyStageEntity childItem in childStages)
                {
                    childItem.Percentage    = 1;
                    childItem.CurrentOption = childItem.BeginOption;
                }
                resultList.AddRange(childStages);
            }
            else
            {
                int minChildNo = childStages.Min(s => s.StageNo);
                StudentApplyStageEntity firstChild = childStages.SingleOrDefault(s => s.StageNo == minChildNo);
                firstChild.Percentage    = 1;
                firstChild.CurrentOption = firstChild.BeginOption;

                resultList.Add(firstChild);
            }

            //保存到数据库中
            repository.UpdateStudentApplyStages(resultList);
        }
Esempio n. 3
0
        /// <summary>
        /// 获取并设置下一子阶段信息,仅在当前子阶段完成,而其他兄弟子阶段未全部完成才调用
        /// </summary>
        /// <param name="currentChildStage"></param>
        /// <returns></returns>
        public string ChildStageFinishHandler_GetNextSibling(StudentApplyStageEntity currentChildStage)
        {
            Guid studentID = currentChildStage.StudentID;
            IEnumerable <StudentApplyStageEntity> siblingChild = repository.StudentApplyStage
                                                                 .Where(s => s.StudentID == studentID && s.ParentNo == currentChildStage.ParentNo && s.StageClass == 2 && s.StageNo != currentChildStage.StageNo);

            StudentApplyStageEntity nextChild;

            //如果兄弟阶段的Percent 都不为0,则选取第一个未完成的阶段
            //否则,选取第一个未开始的阶段,Percent 为0
            if (siblingChild.Count(s => s.Percentage == 0) <= 0)
            {
                nextChild = siblingChild.Where(s => s.Percentage > 0 && s.Percentage < 100).OrderBy(s => s.StageNo).First();
            }
            else
            {
                nextChild               = siblingChild.Where(s => s.Percentage == 0).OrderBy(s => s.StageNo).First();
                nextChild.Percentage    = 1;
                nextChild.CurrentOption = nextChild.BeginOption;
                repository.SaveStudentApplyStage(nextChild);
            }
            return(nextChild.StageNameEn);
        }
Esempio n. 4
0
        public StageSubmitCBModel ChildStageFinishHandler(StudentApplyStageEntity childStage)
        {
            //dynamic resultObject = new ExpandoObject();
            StageSubmitCBModel resultData = new StageSubmitCBModel();


            StudentApplyStageEntity parentStage = repository.StudentApplyStage.SingleOrDefault(s => s.StudentID == childStage.StudentID && s.StageNo == childStage.ParentNo);

            parentStage.Percentage = UpdateParentPercentage(parentStage.StageNo, parentStage.StudentID);
            if (parentStage.Percentage == 100)
            {
                resultData.IsParentComplete = true;
                resultData.NextParentNameEn = ChildStageFinishHandler_GetNextParent(parentStage);
            }
            else
            {
                resultData.IsParentComplete  = false;
                resultData.NextSiblingNameEn = ChildStageFinishHandler_GetNextSibling(childStage);
            }
            repository.SaveStudentApplyStage(parentStage);

            return(resultData);
        }
Esempio n. 5
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="stageNo">当前阶段ID</param>
        /// <param name="refBeginDate">基准开始日期</param>
        /// <param name="refEndDate">基准结束日期</param>
        /// <param name="currentDetail">当前阶段Detail</param>
        /// <param name="studentID">学生ID</param>
        /// <param name="isDateSameWithParent">是否和父阶段日期一样</param>
        /// <returns></returns>
        StudentApplyStageEntity CalApplyStage(
            int stageNo,
            DateTime refBeginDate,
            DateTime?refEndDate,
            ApplyStageVersionDetailEntity currentDetail,
            Guid studentID,
            bool isDateSameWithParent,
            DateTime signDate)
        {
            StudentApplyStageEntity applyStage = new StudentApplyStageEntity
            {
                ID                   = Guid.NewGuid(),
                StudentID            = studentID,
                StageNo              = stageNo,
                StageName            = currentDetail.StageName,
                StageNameEn          = currentDetail.StageNameEn,
                StageClass           = currentDetail.StageClass,
                ParentNo             = currentDetail.ParentNo,
                IsForbid             = currentDetail.IsForbid,
                StatusOption         = currentDetail.StatusOption,
                BeginOption          = currentDetail.BeginOption,
                EndOption            = currentDetail.EndOption,
                CurrentOption        = currentDetail.BeginOption,
                CanForbid            = currentDetail.CanForbid,
                CanChangeDate        = currentDetail.CanChangeDate,
                CanChangeName        = currentDetail.CanChangeName,
                IsDateSameWithParent = currentDetail.IsDateSameWithParent
            };

            //如果当前阶段的日期与父阶段一样,则直接赋值即可
            if (isDateSameWithParent)
            {
                applyStage.BeginDate = refBeginDate;
                applyStage.EndDate   = Convert.ToDateTime(refEndDate);
            }
            else
            {
                //如果当前阶段的开始日期需要计算,则在基准开始日期上加上给定天数
                if (Convert.ToBoolean(currentDetail.IsCalBeginDate))
                {
                    applyStage.BeginDate = refBeginDate.AddDays(Convert.ToInt16(currentDetail.BeginDate));
                }
                else    //否则,则拼接年、月、日 来计算日期。下面算法的结果是,计算出给定月份的最后一天的日期值
                {
                    int year  = (signDate.Month > currentDetail.BeginDate) ? signDate.Year + 1 : signDate.Year;
                    int month = Convert.ToInt16(currentDetail.BeginDate) + 1;
                    if (month > 12)
                    {
                        year += 1;
                        month = 1;
                    }
                    int day = 1;
                    applyStage.BeginDate = new DateTime(year, month, day).AddDays(-1);
                }

                //如果当前阶段的结束日期需要计算,则在基准结束日期上加上给定天数
                if (Convert.ToBoolean(currentDetail.IsCalEndDate))
                {
                    applyStage.EndDate = applyStage.BeginDate.AddDays(Convert.ToInt16(currentDetail.EndDate));
                }
                else    //否则,则拼接年、月、日 来计算日期。下面算法的结果是,计算出给定月份的最后一天的日期值
                {
                    int year  = (signDate.Month > currentDetail.EndDate) ? signDate.Year + 1 : signDate.Year;
                    int month = Convert.ToInt16(currentDetail.EndDate) + 1;
                    if (month > 12)
                    {
                        year += 1;
                        month = 1;
                    }
                    int day = 1;
                    applyStage.EndDate = new DateTime(year, month, day).AddDays(-1);
                }
            }
            return(applyStage);
        }
Esempio n. 6
0
        /// <summary>
        /// 根据VersionDetailList 计算出ApplySchedule,新的哦!
        /// </summary>
        /// <param name="VersionDetailList"></param>
        /// <returns></returns>
        List <StudentApplyStageWrap> CalApplyStageWrapList(Guid studentID, DateTime signDate, Guid versionID)
        {
            //函数的返回值
            List <StudentApplyStageWrap> applyStageWrapList = new List <StudentApplyStageWrap>();

            //定义函数中会用到的两个局部变量
            StudentApplyStageEntity parentStage = null;
            StudentApplyStageEntity childStage  = null;

            //用于暂时性的存储已经完成初始化的ApplyStage的List
            List <StudentApplyStageEntity> resultStageList = new List <StudentApplyStageEntity>();
            //根据版本ID 从数据库中获取IsForbid 为false 的 VersionDetailList
            List <ApplyStageVersionDetailEntity> versionDetailList =
                repository.ApplyStageVersionDetail
                .Where(a => a.VersionID == versionID && a.IsForbid == false)
                .ToList();

            //获取StageClass = 1 的StageNo数组
            int[] parentStageArray = versionDetailList.Where(a => a.StageClass == 1).OrderBy(a => a.StageNo).Select(a => a.StageNo).ToArray();
            //遍历父阶段
            for (int i = 0; i < parentStageArray.Length; i++)
            {
                //下面初始化两个局部变量
                DateTime refBeginDate = DateTime.Now;
                DateTime refEndDate   = DateTime.Now;

                int parentStageNo = parentStageArray[i];
                //根据StageNo 取出VersionDetail
                ApplyStageVersionDetailEntity currentParentDetail = versionDetailList.SingleOrDefault(v => v.StageNo == parentStageNo);

                //如果当前父阶段为同辈阶段的第一个,则基准开始时间设为签约日期
                if (i == 0 || currentParentDetail.IsCalBeginDate == false)
                {
                    refBeginDate = signDate;
                }
                else    //否则,基准开始日期为兄长阶段的结束日期
                {
                    refBeginDate = resultStageList.SingleOrDefault(s => s.StageNo == Convert.ToInt16(parentStageArray[i - 1])).EndDate;
                }
                //父阶段调用该方法时,最后一个参数全为false
                parentStage = CalApplyStage(parentStageNo, refBeginDate, null, currentParentDetail, studentID, false, signDate);
                if (parentStage.BeginDate > parentStage.EndDate)
                {
                    parentStage.EndDate = parentStage.BeginDate.AddMonths(1);
                }

                //获取当前阶段的子阶段的StageNo 数组
                int[] childClass = versionDetailList.Where(a => a.ParentNo == parentStageNo && a.IsForbid == false).OrderBy(a => a.StageNo).Select(a => a.StageNo).ToArray();
                for (int j = 0; j < childClass.Length; j++)
                {
                    //将子阶段的StageNo 由字符串转换为数字
                    int childStageNo = childClass[j];
                    //根据StageNo 取出VersionDetail
                    ApplyStageVersionDetailEntity currentChildDetail = versionDetailList.SingleOrDefault(v => v.StageNo == childStageNo);

                    //如果子阶段的开始结束日期与父阶段一样的话,基准开始结束日期均与父阶段一致
                    if (currentChildDetail.IsDateSameWithParent)
                    {
                        childStage = CalApplyStage(childStageNo, parentStage.BeginDate, parentStage.EndDate, currentChildDetail, studentID, true, signDate);
                    }
                    else
                    {
                        //如果当前子阶段为同辈阶段的第一个,则基准开始时间设为父阶段的开始日期
                        if (j == 0)
                        {
                            refBeginDate = parentStage.BeginDate;
                        }
                        else     //否则,基准开始日期为兄长阶段的结束日期
                        {
                            refBeginDate = resultStageList.SingleOrDefault(s => s.StageNo == childClass[j - 1]).EndDate;
                        }
                        childStage = CalApplyStage(childStageNo, refBeginDate, null, currentChildDetail, studentID, false, signDate);
                    }

                    //把当前阶段的信息存储到resultStageList中,同辈间遍历的时候会用到
                    resultStageList.Add(childStage);
                }

                //如果当前父阶段的子阶段有时间限制,则把最后一个子阶段的EndDate值赋给父阶段的EndDate
                if (!currentParentDetail.IsDateSameWithParent && childClass.Length > 0)
                {
                    parentStage.EndDate = resultStageList.SingleOrDefault(s => s.StageNo == childClass.Last()).EndDate;
                }

                //把当前阶段的信息存储到resultStageList中,同辈间遍历的时候会用到
                resultStageList.Add(parentStage);
            }

            //最后,将resultStageList 按封装成StudentApplyStageWrap 对象列表
            foreach (StudentApplyStageEntity parentStageItem in resultStageList.Where(s => s.ParentNo == 1))
            {
                applyStageWrapList.Add(new StudentApplyStageWrap {
                    ParentStage = parentStageItem,
                    ChildStages = resultStageList
                                  .Where(s => s.ParentNo == parentStageItem.StageNo)
                                  .OrderBy(r => r.StageNo)
                                  .ToList()
                });
            }

            return(applyStageWrapList);
        }